2017-05-21 3 views
0

Ich möchte eine CSV-Datei für eine Reihe von Elementen lesen, die entweder metallisch oder nichtmetallisch sein können und jede Zeile in der CSV-Datei haben kann mehrere Elemente. Wenn es mehrere Elemente hat, haben alle Zeilen der Datei diese Anzahl an Elementen. Eine gültige Linie wird wie folgt aussehen:Wie liest und verarbeitet man eine Zeile, die mehrere Objekte in einer Zeile haben kann JAVA

<symbol,name,atomNum,mass,other/><symbol,name,atomNum,mass,other/> 

, wo andere ein Zeichen, wenn sein ein Nichtmetall und Doppel wenn ihr ein Metall. Dies ist, was ich bisher getan und bin nicht sicher, wie in mehreren Elementobjekten auf der Linie lesen

public static void readValues(String fileName) 
{ 
    if (!constructed) 
    { 
     FileInputStream fileStrm = null; 
     InputStreamReader rdr; 
     BufferedReader bufRdr; 
     String line; 
     int lineNum; 
     try 
     { 
      fileStrm = new FileInputStream(fileName); 
      rdr = new InputStreamReader(fileStrm); 
      bufRdr = new BufferedReader(rdr); 
      lineNum = 0; 
      line = bufRdr.readLine(); 
      while(line != null) 
      { 
       lineNum++; 
       elements[lineNum - 1] = processElements(line); 
       line = bufRdr.readLine(); 
       System.out.println(elements); 
      } 
      fileStrm.close(); 
     } 
     catch(IOException e) 
     { 
      if(fileStrm != null) 
      { 
       try 
       { 
        fileStrm.close(); 
        constructed = true; 
       } 
       catch (IOException ex2) 
       { 
       } 
      } 
      System.out.print("error in file processing: " + e.getMessage()); 
     } 
    } 
} 

private static Element processElements(String line) 
{ 
    char chr; 
    Element element; 
    String[] lineArray = line.split(","); 
    if(lineArray[4] == chr) 
    { 
     element = new NonMetal(); 
     elements.setState(lineArray[4]); 
    } 
    else 
    { 
     element = new Metal(); 
     element.setConduct(Double.parseDouble(lineArray[4])); 
    } 
    element.setSymbol(lineArray[0]); 
    element.setName(lineArray[1]); 
    element.setAtomNum(Integer.parseInt(lineArray[2])); 
    element.setMass(Double.parseDouble(lineArray[3])); 
    return elements; 
} 

Ich habe eine Super-Elementklasse und zwei Unterklassen, Metall und Nichtmetall, die jeweils die Standardmethoden für eine enthalten Klasse

Antwort

0

Sie könnten eine Regex verwenden, um eine Gruppe zwischen < und /> während der Verarbeitung der Linie zu identifizieren.

<(\w+),(\w+),(\w+),(\w+),(\w+)\/> 

https://regex101.com/r/bKnYJZ/1/

String line = "<symbol,name,atomNum,mass,other/><symbol,name,atomNum,mass,other/>"; 
String regex = "<(\\w+),(\\w+),(\\w+),(\\w+),(\\w+)\\/>"; 
Matcher matcher = Pattern.compile(regex) 
         .matcher(line); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
    System.out.println(matcher.group(2)); 
    System.out.println(matcher.group(3)); 
    System.out.println(matcher.group(4)); 
    System.out.println(matcher.group(5)); 
} 

Sie können diesen Code in Ihre processElements Methode setzen jedes Element zwischen </>

Abgesehen von Ihrem Problem zu identifizieren, schlage ich die Verwendung von try-resource-close für eine einfachere und kürzere Ressourcenhandhabung.

try(FileInputStream fileStrm = new FileInputStream(fileName); 
    InputStreamReader rdr = new InputStreamReader(fileStrm); 
    BufferedReader bufRdr = new BufferedReader(rdr)) 
{ 
    // here your code and no need to take care of resource closing... 
} 
catch(IOException e) 
{ 
    System.out.print("error in file processing: " + e.getMessage()); 
} 
+0

Vielen Dank für Ihre Antwort. Diese Methode scheint den Job zu machen, ich muss mich nur mit Regex vertraut machen. Ein Problem ist jedoch, dass es auf einer Linie möglich ist, n Elemente zu haben, was bedeutet, dass es 3,4,8,9 Elemente auf einer einzigen Linie haben könnte. Wie kann ich das erklären? Ich denke, Sie müssen die Anzahl der "<" Zeichen zählen, die den Start eines Elements initiieren und diese Anzahl verwenden, um eine angemessene Anzahl von Elementen zu erstellen – killerstick1

Verwandte Themen