2013-08-19 14 views
6

Hey Leute, ich schreibe einen Parser-Code, um eine .csv-Datei zu lesen und in XML zu parsen. Dies ist der Code, den ich habe und es funktioniert gut, außer ich möchte es die erste Zeile in der Datei überspringen. Also beschloss ich, eine HashMap einzurichten, aber es scheint zu funktionieren:Überspringe die erste Zeile beim Lesen der CSV-Datei in Java

for (int i = 0; i < listOfFiles.length; i++) { 
     File file = listOfFiles[i]; 
     if (file.isFile() && file.getName().endsWith(".csv")){ 

      System.out.println("File Found: " + file.getName());//Prints the name of the csv file found 

      String filePath = sourcepath + "\\" + file.getName(); 

      BufferedReader br = new BufferedReader(new FileReader(file)); 


String line; 
int n = 1; 
Map<Integer,String> lineMap = new HashMap<Integer,String>(); 
int k=2; 
while ((line = br.readLine()) != null) { 
    System.out.println(n + " iteration(s) of 1st While Loop"); 

        lineMap.put(k, line); 

    fw.write("   <ASSET action=\"AddChange\">\n"); 
    fw.write("    <HOSTNAME>\n"); 
    hostName=line.substring(0, line.indexOf(",")); 
    fw.append(hostName); 
    fw.write("</HOSTNAME>\n"); 
    fw.write("    <HOSTID>\n"); 
    hostID=line.substring(line.indexOf(",")+1, nthOccurrence(line, ',', 1)); 
    fw.append(hostID); 
    fw.write("</HOSTID>\n"); 
    fw.write("    <MACMODEL>\n"); 
    machineModel=line.substring(nthOccurrence(line, ',', 1)+1, nthOccurrence(line, ',', 2)); 
    fw.append(machineModel); 
    fw.write("</MACMODEL>\n"); 
    fw.write("    <PROMODEL>\n"); 
    processorModel=line.substring(nthOccurrence(line, ',', 2)+1, nthOccurrence(line, ',', 3)); 
    fw.append(processorModel); 
    fw.write("</PROMODEL>\n"); 
    fw.write("    <CORE>\n"); 
    core=line.substring(nthOccurrence(line, ',', 3)+1, nthOccurrence(line, ',', 4)); 
    fw.append(core); 
    fw.write("</CORE>\n"); 
    fw.write("    <PROC>\n"); 
    proc=line.substring(nthOccurrence(line, ',', 4)+1, nthOccurrence(line, ',', 5)); 
    fw.append(proc); 
    fw.write("</PROC>\n"); 
    fw.write("    <TIER>\n"); 
    tier=line.substring(nthOccurrence(line, ',', 5)+1, nthOccurrence(line, ',', 6)); 
    fw.append(tier); 
    fw.write("</TIER>\n"); 
    fw.write("    <PRODNAME>\n"); 
    productName=line.substring(nthOccurrence(line, ',', 6)+1, nthOccurrence(line, ',', 7)); 
    fw.append(productName); 
    fw.write("</PRODNAME>\n"); 
    fw.write("    <VERSION>\n"); 
    version=line.substring(nthOccurrence(line, ',', 7)+1, nthOccurrence(line, ',', 8)); 
    fw.append(version); 
    fw.write("</VERSION>\n"); 
    fw.write("    <SCRIPTDATA>\n"); 
    scriptData=line.substring(nthOccurrence(line, ',', 8)+1, line.length()); 
    fw.append(scriptData); 
    fw.write("</SCRIPTDATA>\n"); 


    fw.write("   </ASSET>\n"); 
    k++; 
}n++; 

Dies ist ein Ausschnitt aus dem Hauptteil des Codes. Irgendwelche Ideen oder Lösungen ???

+0

Nicht dein Down-Voter, aber klär deine "es scheint zu arbeiten", bitte. –

+0

sorry typo .... es scheint nicht zu funktionieren – user2643355

+0

Wir wissen das, aber in der Zukunft, erzählen mehr darüber, wie es nicht funktioniert. Je mehr nützliche Informationen Sie geben, desto einfacher wird es, Ihre Fragen zu beantworten. –

Antwort

20

Sie betrachten könnte headerLine = br.readLine() vor Ihrer while-Schleife platzieren, so dass Sie den Header separat verbrauchen aus dem Rest der Datei. Sie könnten auch die Verwendung von opencsv für CSV-Parsing in Erwägung ziehen, da dies Ihre Logik vereinfachen könnte.

5

Erstellen Sie eine Variable interation und initialisieren Sie mit 0. Überprüfen Sie es als allererstes in while Schleife.

String line; 
int iteration = 0; 
while ((line = br.readLine()) != null) { 
    if(iteration == 0) { 
     iteration++; 
     continue; 
    } 
    ... 
    ... 
} 
+0

Was, wenn ich die ersten beiden Zeilen überspringen wollte? eine Zeile mit Text und die nächste Zeile ist eine leere Zeile/Leerzeichen? –

+1

@KalaJ: Do '' if (Iteration == 0 || Iteration == 1) '' stattdessen oder noch besser '' if (Iteration <2) ''. Ich habs? – user1438038

1

Ich bin ziemlich verwirrt von Ihrem Code, haben Sie die lineMap und Sie haben auch fw (was auch immer das ist). Welchen benutzen Sie? Sie sagen, dass Sie die erste Zeile überspringen wollen, aber Sie nicht

if (firstLine == true) { 
    firstLine = false; 
    continue; 
} 

ich auch eine Bibliothek wie CSVReader vorschlagen würde, mit dem ich glaube sogar hat eine Eigenschaft ignoreFirstLine

http://opencsv.sourceforge.net/apidocs/au/com/bytecode/opencsv/CSVReader.html

2

warum don ‚t Sie das nur für Schleife verwenden

for(int i=1; (line = br.readLine()) != null; i++) 
{ 
    //Your code 
} 
0

Nutzungspuffer Leser zweimal, wie folgt aus:

while ((line = br.readLine()) != null) { 
    while ((line = br.readLine()) != null) { 
    //your code      
    } 
} 
-1

für die Erstlinientherapie Skipping (die normalerweise Header der Spalten enthält) nehmen eine Variable, und erhöhen diese Variable in while-Schleife an erster Stelle, und fortzusetzen;

int lineNumber = 0; 

and then in while loop 

while ((line = br.readLine()) != null) { 
         if(lineNumber == 0) { 
          lineNumber++; 
          continue; 
         } 
         lineNumber++; 

         //do waterver u have to do with the tokens in this line(second line) 

      } 
+1

Die gleiche grundlegende Antwort wurde vor mehr als einem Jahr gepostet. –

3

Ich fühle mich gezwungen, eine java 8 aromatisierte Antwort hinzuzufügen.

List<String> xmlLines = new BufferedReader(new FileReader(csvFile)) 
    .lines() 
    .skip(1) //Skips the first n lines, in this case 1  
    .map(s -> { 
     //csv line parsing and xml logic here 
     //... 
     return xmlString; 
    }) 
    .collect(Collectors.toList()); 
0
boolean isRecord = false; 
for (CSVRecord record : records) { 
    if(isRecord){ 
     //process records here. 
    }else{ 
     isRecord = true; 
    } 
} 

Statt Zähler Hinzufügen Flagge der Zugabe wird die Leistung nicht getroffen.