web-dev-qa-db-ja.com

JavaでCSVファイルを読み込んでいる間、最初の行をスキップします

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

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

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

8
user2643355

headerLine = br.readLine()をwhileループの前に配置して、ファイルの残りの部分とは別にヘッダーを使用することを検討する場合があります。また、csvの解析に opencsv を使用してロジックを簡略化することもできます。

26
David Maust

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

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

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());
5
n4rzul

forループを使用しないのはなぜですか

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

私はあなたのコードにかなり混乱しています。あなたはlineMapを持っており、fw(それが何であれ)も持っています。どちらを使用していますか?あなたは最初の行をスキップしたいと言いますが、あなたはしません

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

また、CSVReaderのようなライブラリを使用することをお勧めします。

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

1
Scary Wombat

次のように、バッファーリーダーを2回使用します。

while ((line = br.readLine()) != null) {
  while ((line = br.readLine()) != null) {
    //your code                     
  }
}
0
user3418885
boolean isRecord = false;
for (CSVRecord record : records) {
    if(isRecord){
        //process records here.
    }else{
        isRecord = true;
    }
}

カウンター追加フラグを追加する代わりに、パフォーマンスに影響を与えません。

0
rahulpatil