2013-08-19 4 views
6

Привет, ребята Я пишу код анализатора, чтобы прочитать CSV-файл и проанализировать его на XML. Это код, который у меня есть, и он отлично работает, за исключением того, что я хотел бы пропустить первую строку в файле. Поэтому я решил создать HashMap, но это, кажется, работа:Пропустить первую строку при чтении CSV-файла в 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++; 

Это фрагмент из основной части кода. Любые идеи или решения ???

+0

Не ваш нисходящий избиратель, но уточните, что ваш '' он, похоже, работает », пожалуйста. –

+0

извините, опечатка ... кажется, не работает – user2643355

+0

Мы знаем это, но в будущем расскажем больше о том, как это не работает. Чем больше полезной информации вы дадите, тем легче будет отвечать на ваши вопросы. –

ответ

20

вы могли бы рассмотреть возможность размещения headerLine = br.readLine() до вашего цикла в то время, так что вы потребляете separat заголовка из остальной части файла. Также вы можете использовать opencsv для синтаксического анализа csv, поскольку это может упростить вашу логику.

5

Создать переменную interation и инициализировать с помощью 0. Проверьте это как первое, что в петле while.

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

Что делать, если я хотел пропустить первые две строки? одна строка с текстом, а следующая строка - пустая строка/пробел? –

+1

@KalaJ: «if (iteration == 0 || iteration == 1)' 'вместо или даже лучше' 'if (iteration <2)' '. Понял? – user1438038

1

Я довольно смущен ваш код, ваш иметь lineMap и вы также ФВ (независимо от того, что есть). Какой из них вы используете? Вы говорите, что вы хотите, чтобы пропустить первую строку, но вы не

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

Я также хотел бы предложить использовать библиотеку как CSVReader, которую я верю даже имеет свойство ignoreFirstLine

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

2

почему дон «т вы просто использовать для петли

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

Использование читателя буфера в два раза, как это:

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

для пропуска первой строки (который обычно содержит заголовок столбцов) принимает переменную и увеличить эту переменную в то время как петли на первом месте, и по-прежнему;

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

Тот же базовый ответ был опубликован более года назад. –

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

Вместо добавления счетчика добавления флаг не ударит по производительности.