简体   繁体   English

在 Java 中读取 CSV 文件时跳过第一行

[英]Skip first line while reading CSV file in Java

I am writing a parser code to read a .csv file and parse it to XML.我正在编写解析器代码来读取 .csv 文件并将其解析为 XML。 This is the code I have and it works, except I would like it to skip the first line in the file.这是我拥有的代码,它可以工作,除了我希望它跳过文件中的第一行。 So I decided to set up a HashMap but it doesn't seem to work:所以我决定设置一个 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++;

This is a snippet of the main part of the code.这是代码主要部分的片段。 Any Ideas or Solutions???任何想法或解决方案???

You might consider placing headerLine = br.readLine() before your while loop so you consume the header separately from the rest of the file.您可能会考虑将headerLine = br.readLine()放在 while 循环之前,以便将标头与文件的其余部分分开使用。 Also you might consider using opencsv for csv parsing as it may simplify your logic.您也可以考虑使用opencsv进行 csv 解析,因为它可以简化您的逻辑。

I feel compelled to add a java 8 flavored answer.我觉得有必要添加一个 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());

Create a variable interation and initialize with 0 .创建一个变量interation并使用0进行初始化。 Check it as very first thing in while loop.while循环中将其作为第一件事进行检查。

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

I am rather confused by your code, your have the lineMap and you also have fw (whatever that is).我对你的代码感到很困惑,你有 lineMap 并且你也有 fw (不管是什么)。 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我还建议使用像 CSVReader 这样的库,我相信它甚至有一个属性 ignoreFirstLine

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

why don't you just use the for loop为什么不直接使用 for 循环

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

An easy technique, declare a variable and assign it a value (eg int k = 0; ), and increment the variable value right after you enter into the loop.一种简单的技术,声明一个变量并为其分配一个值(例如int k = 0; ),然后在您进入循环后立即增加变量值。 The code is given below.代码如下。

BufferedReader csvReader = new BufferedReader(new FileReader("mycsv.csv"));
        // declare a variable
        int k=0;
        while ((row = csvReader.readLine()) != null) {
            if(k == 0){
                k++;
                continue;
            }
         //rest of your code 
         // inside while loop
        }

Use buffer reader two times, like this:使用缓冲区读取器两次,如下所示:

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

Instead of adding counter adding flag will not hit the performance.而不是添加计数器添加标志不会影响性能。

A simple solution, read the first line outside of the loop一个简单的解决方案,读取循环外的第一行

        String[] nextLine;
        String[] headerLineInCSVFile = csvReader.readNext();
        while ((nextLine = csvReader.readNext()) != null) {
            String columnOne = nextLine[0];
        }

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;对于跳过第一行(通常包含列的标题),取一个变量并首先在 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)

            }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM