2013-08-19 22 views
6

Hey guys .csv dosyasını okumak ve XML'ye ayrıştırmak için bir ayrıştırıcı kodu yazıyorum. Bu sahip olduğum kod ve dosyadaki ilk satırı atlamak istemem dışında iyi çalışıyor. Bu yüzden bir HashMap kurmaya karar ama işe görünüyor:Java'da CSV dosyasını okurken ilk satırı atla

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

Bu kodun ana kısmının snippet'idir. Herhangi bir Fikir veya Çözüm ???

+0

Sizin aşağı-seçmeniniz değil, "Çalıştığınız gibi gözüküyor", lütfen. –

+0

üzgünüm tipo .... işe yaramıyor gibi görünüyor – user2643355

+0

Bunu biliyoruz, ama gelecekte nasıl çalıştığını daha fazla anlat. Verdiğiniz daha yararlı bilgiler, sorularınızı cevaplamak o kadar kolay olacaktır. –

cevap

20

için kullanmak Dosyanın geri kalanından ely. Ayrıca, mantığınızı basitleştirebileceğinden, csv ayrıştırma için opencsv kullanmayı düşünebilirsiniz.

5

interation değişkenini oluşturun ve 0 ile başlatın. while döngüsündeki ilk şey olarak kontrol edin.

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

İlk iki satırı atlamak istesem ne olur? metin ile bir satır ve bir sonraki satır boş bir satır/boşluk mu? –

+1

@KalaJ: (iteration == 0 || iteration == 1) '' yerine ya da daha iyisi '' (yineleme <2) '' ise. Anladım? – user1438038

1

Ben senin koduna göre oldukça karıştı, senin lineMap varsa ve aynı zamanda (yani her neyse) fw var. Hangisini kullanıyorsun? Eğer ilk satırı atlamak istediğini söylüyorsun ama sen

if (firstLine == true) { 
    firstLine = false; 
    continue; 
} 
Ben de bile inanıyoruz CsvReader gibi bir kitaplığı kullanarak öneririm

bir özellik ignoreFirstLine sahiptir

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

2

neden don do 't sen sadece başlık separat tüketmek sahibi olması için while döngüsünde önce headerLine = br.readLine() yerleştirerek düşünebilirsiniz döngü

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

kullanımı tampon okuyucu bu gibi iki kez:

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

ilk satırı atlama için (ki normal olarak sütun başlığı içerir) bir değişken almak ve ilk yerde ise döngü Bu değişken arttırmak ve devam edin;

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

Aynı temel cevap bir yıldan fazla bir süre önce yayınlandı. –

3

Ben bir java 8 aromalı cevap eklemek zorunda hissediyorum. Bunun yerine performansı girmeyecektir işaretini ekleyerek sayaç ekleme

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

.