-->

Skip first line while reading CSV file in Java

2019-03-26 15:42发布

问题:

Hey guys I am writing a parser code to read a .csv file and parse it to XML. This is the code I have and it works fine except I would like it to skip the first line in the file. So I decided to set up a HashMap but it does seem to work:

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

This is a snippet of the main part of the code. Any Ideas or Solutions???

回答1:

You might consider placing headerLine = br.readLine() before your while loop so you consume the header separately from the rest of the file. Also you might consider using opencsv for csv parsing as it may simplify your logic.



回答2:

Create a variable interation and initialize with 0. Check it as very first thing in while loop.

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


回答3:

I feel compelled to add a java 8 flavored answer.

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


回答4:

why don't you just use the for loop

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


回答5:

I am rather confused by your code, your have the lineMap and you also have fw (whatever that is). Which one are you using? You say you want to skip the first line, but you don't

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

I would also suggest using a library like CSVReader which I belive even has a property ignoreFirstLine

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



回答6:

Use buffer reader two times, like this:

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


回答7:

boolean isRecord = false;
for (CSVRecord record : records) {
    if(isRecord){
        //process records here.
    }else{
        isRecord = true;
    }
}

Instead of adding counter adding flag will not hit the performance.



回答8:

For skipping first line(which normally contains header of the columns) take a variable and increase this variable in while loop at first place, and continue;

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)

            }


标签: java csv line skip