2013-08-19 15 views
6

ちょっとちょっと.CSVファイルを読み込んでXMLに解析するパーサーコードを書いています。これは私が持っているコードであり、ファイル内の最初の行をスキップしたい場合を除いて正常に動作します。だから私はHashMapを設定することにしましたが、うまくいくようです:JavaでCSVファイルを読み込んでいる最初の行をスキップする

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

これはコードの主要部分のスニペットです。任意のアイデアまたはソリューション???

+0

あなたの有権者ではありませんが、あなたのことを明確にしてください。 –

+0

申し訳ありませんが、誤って入力されているようです。 – user2643355

+0

これは知っていますが、将来的にどのように動作しないのかを教えてください。より有用な情報を提供すればするほど、あなたの質問に簡単に答えることができます。 –

答えて

20

に使用しますファイルの残りの部分から始まります。また、あなたのロジックを簡略化するかもしれないので、csv解析にopencsvを使用することを検討するかもしれません。

5

変数interationを作成し、0で初期化します。それはループの最初のものとしてそれを確認してくださいwhileループ。

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

最初の2行をスキップするとどうなりますか?テキストを含む1行と次の行は空の行/空白ですか? –

+1

@ KalaJ: '' if(iteration == 0 || iteration == 1) ''や '' if(iteration <2) ''の方が良いでしょう。とった? – user1438038

1

私はあなたのコードではなく、混乱しています、あなたは、ラインマップを持っていても(つまり、何でも)FWを持っています。あなたはどちらを使っていますか?なぜドンignoreFirstLine

2

http://opencsv.sourceforge.net/apidocs/au/com/bytecode/opencsv/CSVReader.html 私も、私は信じてCSVReaderのようなライブラリを使用することをお勧めしさえ性質を持っているあなたは、あなたが最初の行をスキップしたいと言っていますが、ないない

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

「tは、あなたはちょうどあなたがヘッダーseparatを消費するので、あなたは、あなたのwhileループの前にheaderLine = br.readLine()を配置することを検討可能性があるループ

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

使用バッファリーダーこのような2回:

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

最初の行をスキップする(これは、通常、列のヘッダを含む)の変数を取り、最初の場所でwhileループにこの変数を増加させ、引き続き、

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

同じ基本回答が1年以上前に投稿されました。 –

3

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

関連する問題