2013-08-19 17 views
6

Hej, piszę kod parsera, aby przeczytać plik .csv i przeanalizować go do XML. To jest kod, który mam i działa dobrze, z wyjątkiem tego, że chciałbym pomijać pierwszą linię w pliku. Postanowiłem więc założyć HashMap ale wydaje się działać:Pomiń pierwszy wiersz podczas odczytu pliku CSV w Javie

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++; 

Jest to fragment głównej części kodu. Wszelkie pomysły lub rozwiązania?

+0

Nie twoja odmowa głosowania, ale wyjaśnij swoje "wydaje się działać", proszę. –

+0

Przykro mi, litero .... to nie działa – user2643355

+0

Wiemy o tym, ale w przyszłości powiemy więcej o tym, jak to nie działa. Im więcej przydatnych informacji, tym łatwiej odpowiedzieć na twoje pytania. –

Odpowiedz

20

można rozważyć umieszczenie headerLine = br.readLine() przed pętli while więc zużywają separat nagłówka ely z pozostałej części pliku. Możesz także rozważyć użycie opencsv do parsowania csv, ponieważ może to uprościć Twoją logikę.

5

Utwórz zmienną interation i zainicjuj za pomocą 0. Sprawdź to jako pierwszą rzecz w pętli while.

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

Co jeśli chciałbym pominąć pierwsze dwie linie? jedna linia z tekstem i następna linia to pusty wiersz/spacja? –

+1

@KalaJ: Wykonaj '' if (iteracja == 0 || iteracja == 1) 'zamiast tego lub nawet lepiej' 'if (iteracja <2)' '. Rozumiem? – user1438038

1

Jestem raczej zdezorientowany twoim kodem, twój ma mapę liniową i ty też masz fw (cokolwiek to jest). Którego używasz? Mówisz, że chcesz pominąć pierwszą linię, ale nie

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

Chciałbym również zasugerować przy użyciu biblioteki jak CsvReader które wierzę nawet ma właściwość ignoreFirstLine

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

2

dlaczego don „t po prostu użyć pętli for

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

użycie czytnika bufor dwa razy, na przykład:

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

przeskakiwania pierwszego (które zwykle zawiera nagłówek kolumny) ma zmienną i zwiększenie tej zmiennej w pętli while pierwszego miejsca i dalej;

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

Ta sama podstawowa odpowiedź została wysłana ponad rok temu. –

3

Czuję się zmuszony do dodania odpowiedzi o smaku java 8.

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; 
    } 
} 

Zamiast dodawać licznik dodając flagę nie trafi na wydajność.

Powiązane problemy