Пропустить первую строку при чтении CSV-файла на Java
Эй, ребята, я пишу код парсера для чтения .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 ответов
вы можете рассмотреть возможность размещения headerLine = br.readLine()
перед циклом while, поэтому вы используете заголовок отдельно от остальной части файла. Также вы можете использовать opencsv для CSV разбора, как это может упростить вашу логику.
создать переменную interation
и инициализировать с помощью 0
. Проверьте это как самое первое в while
петли.
String line;
int iteration = 0;
while ((line = br.readLine()) != null) {
if(iteration == 0) {
iteration++;
continue;
}
...
...
}
Я чувствую себя вынужденным добавить ответ со вкусом 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());
почему бы вам просто не использовать цикл for
for(int i=1; (line = br.readLine()) != null; i++)
{
//Your code
}
Я довольно смущен вашим кодом, у вас есть линейная карта, и у вас также есть fw (что бы это ни было). Какой из них вы используете? Вы говорите, что хотите пропустить первую строку, но вы не
if (firstLine == true) {
firstLine = false;
continue;
}
Я бы также предложил использовать библиотеку, такую как CSVReader, которая, как я полагаю, даже имеет свойство ignoreFirstLine
http://opencsv.sourceforge.net/apidocs/au/com/bytecode/opencsv/CSVReader.html
используйте buffer reader два раза, например:
while ((line = br.readLine()) != null) {
while ((line = br.readLine()) != null) {
//your code
}
}
boolean isRecord = false;
for (CSVRecord record : records) {
if(isRecord){
//process records here.
}else{
isRecord = true;
}
}
вместо добавления счетчика добавление флага не повлияет на производительность.
для пропуска первой строки (которая обычно содержит заголовок столбцов) возьмите переменную и увеличьте эту переменную в while loop на первом месте и продолжите;
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)
}