2013-08-19 15 views
6

Ciao ragazzi Sto scrivendo un codice parser per leggere un file .csv e analizzarlo in XML. Questo è il codice che ho e funziona bene, tranne che mi piacerebbe che salta la prima riga del file. Così ho deciso di impostare una HashMap, ma sembra funzionare:Salta la prima riga durante la lettura del file CSV 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++; 

Si tratta di un frammento della parte principale del codice. Qualche idea o soluzione ???

+0

Non è il tuo interiore, ma chiarisci il tuo "sembra funzionare", per favore. –

+0

sorry typo .... non sembra funzionare – user2643355

+0

Lo sappiamo, ma in futuro diremo di più su come non funziona. Più informazioni utili darai, più facile sarà rispondere alle tue domande. –

risposta

20

si potrebbe provare a inserire headerLine = br.readLine() prima del vostro ciclo while in modo che si consumano l'intestazione separat ely dal resto del file. Inoltre, potresti prendere in considerazione l'utilizzo di opencsv per l'analisi csv in quanto potrebbe semplificare la logica.

5

Creare una variabile interation e inizializzare con 0. Controlla come prima cosa nel ciclo while.

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

E se volessi saltare le prime due righe? una riga con testo e la riga successiva è una riga vuota/spazio bianco? –

+1

@KalaJ: Do '' if (iteration == 0 || iteration == 1) '' invece o meglio '' if (iterazione <2) ''. Fatto? – user1438038

1

sono piuttosto confuso dal codice, il vostro avere la lineMap e hai anche fw (qualunque cosa sia). Quale stai usando? Tu dici che vuoi saltare la prima linea, ma non lo fai

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

Vorrei anche suggerire utilizzando una libreria come CSVReader che ho belive ha anche un ignoreFirstLine proprietà

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

2

perché don 't è sufficiente utilizzare il ciclo for

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

Uso lettore tampone due volte, come questo:

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

per saltare prima riga (che contiene normalmente testata colonna) prendere una variabile e aumentare questa variabile nel ciclo while in primo luogo, e continua;

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

La stessa risposta di base è stata pubblicata più di un anno fa. –

3

Mi sento in dovere di aggiungere una risposta aromatizzata 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; 
    } 
} 

Invece di aggiungere contatore aggiunta di bandiera non colpirà le prestazioni.

Problemi correlati