2013-08-19 91 views
6

Xin chào các bạn, tôi đang viết một mã trình phân tích cú pháp để đọc tệp .csv và phân tích cú pháp nó thành XML. Đây là mã tôi có và nó hoạt động tốt ngoại trừ tôi muốn nó bỏ qua dòng đầu tiên trong tập tin. Vì vậy, tôi quyết định thiết lập một HashMap nhưng nó dường như hoạt động:Bỏ qua dòng đầu tiên trong khi đọc tệp CSV trong 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++; 

Đây là một đoạn của phần chính của mã. Bất kỳ ý tưởng hoặc giải pháp nào ???

+0

Không phải cử tri bỏ phiếu của bạn, nhưng hãy làm rõ "có vẻ như nó hoạt động". –

+0

xin lỗi typo .... nó dường như không hoạt động – user2643355

+0

Chúng tôi biết rằng, nhưng trong tương lai, hãy nói thêm về cách nó không hoạt động. Thông tin hữu ích hơn bạn cung cấp, càng dễ trả lời câu hỏi của bạn. –

Trả lời

20

Bạn có thể xem xét đặt headerLine = br.readLine() trước vòng lặp while để bạn tiêu thụ phân tách tiêu đề ely từ phần còn lại của tập tin. Ngoài ra, bạn có thể xem xét sử dụng opencsv để phân tích cú pháp csv vì nó có thể đơn giản hóa logic của bạn.

5

Tạo biến interation và khởi tạo với 0. Kiểm tra nó như là điều đầu tiên trong vòng lặp while.

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

Nếu tôi muốn bỏ qua hai dòng đầu tiên thì sao? một dòng với văn bản và dòng tiếp theo là một hàng trống/khoảng trắng? –

+1

@KalaJ: Làm '' if (iteration == 0 || iteration == 1) '' thay thế hoặc thậm chí tốt hơn '' if (iteration <2) ''. Hiểu rồi? – user1438038

1

Tôi khá bối rối bởi mã của bạn, bạn có lineMap và bạn cũng có fw (bất kể đó là gì). Cái nào bạn đang dùng? Bạn nói rằng bạn muốn bỏ qua những dòng đầu tiên, nhưng bạn không

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

Tôi cũng xin đề nghị sử dụng một thư viện như CSVReader mà I belive thậm chí còn có một ignoreFirstLine tài sản

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

2

tại sao don Bạn chỉ cần sử dụng vòng lặp for

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

Sử dụng đầu đọc bộ đệm hai lần, như thế này:

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

Đối bỏ qua dòng đầu tiên (mà thường chứa tiêu đề của các cột) mất một biến và tăng biến này trong vòng lặp while ở vị trí đầu tiên, và tiếp tục;

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

Câu trả lời cơ bản giống nhau đã được đăng hơn một năm trước. –

3

Tôi cảm thấy bắt buộc phải thêm câu trả lời có hương vị 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; 
    } 
} 

Thay vì thêm truy cập thêm lá cờ sẽ không đạt hiệu suất.

Các vấn đề liên quan