Java csv解析器读取头文件

Java csv解析器读取头文件,java,parsing,csv,Java,Parsing,Csv,我正在使用csv解析器,我想分别读取csv文件的头和其余部分。 这是我读取csv的代码 当前代码读取csv文件中的所有内容,但我需要单独读取标题。 请帮我解决这个问题 public class csv { private void csvRead(File file) { try { BufferedReader br = new BufferedReader( new FileReader(file)); String strLine = ""; St

我正在使用csv解析器,我想分别读取csv文件的头和其余部分。 这是我读取csv的代码

当前代码读取csv文件中的所有内容,但我需要单独读取标题。 请帮我解决这个问题

public class csv {

private void csvRead(File file)
{
    try
    {
    BufferedReader br = new BufferedReader( new FileReader(file));
    String strLine = "";
    StringTokenizer st = null;
    File cfile=new File("csv.txt");
    BufferedWriter writer = new BufferedWriter(new FileWriter(cfile));
    int tokenNumber = 0;

    while( (strLine = br.readLine()) != null)
    {
            st = new StringTokenizer(strLine, ",");
            while(st.hasMoreTokens())
            {

                    tokenNumber++;
                    writer.write(tokenNumber+"  "+ st.nextToken());
                    writer.newLine();
            }


            tokenNumber = 0;
            writer.flush();
    }
}

    catch(Exception e)
    {
        e.getMessage();
    }
}
你考虑过吗

这里的前一个问题

看起来你可以很容易地拆分标题

String fileName = "data.csv";
CSVReader reader = new CSVReader(new FileReader(fileName ));


// if the first line is the header
String[] header = reader.readNext();

// iterate over reader.readNext until it returns null
String[] line = reader.readNext();

请考虑使用。这本书是根据《圣经》写的。什么是兼容的阅读这些行:

"aa,a","b""bb","ccc"
而且使用非常简单,只有3个类,以及一个小样本:

解析以制表符作为分隔符的csv字符串,“”作为可选项 值封装器,以及以以下开头的注释:

此外,您还可以将此解析器作为常量使用:

默认-RFC 4180定义的标准逗号分隔格式。 EXCEL-使用逗号作为值分隔符的EXCEL文件格式。 MYSQL—SELECT INTO OUTFILE和LOAD DATA INFILE操作使用的默认MYSQL格式。 TDF-表格分隔格式。
我们有CSVFormat中可用的withHeader方法。如果使用此选项,则可以使用标题读取文件

CSVFormat format=CSVFormat.newFormat','.withHeader; Map headerMap=dataCSVParser.getHeaderMap; 将给你所有的标题

public class CSVFileReaderEx {
    public static void main(String[] args){
        readFile();
    }

    public static void readFile(){
         List<Map<String, String>> csvInputList = new CopyOnWriteArrayList<>();
         List<Map<String, Integer>> headerList = new CopyOnWriteArrayList<>();

         String fileName = "C:/test.csv";
         CSVFormat format = CSVFormat.newFormat(',').withHeader();

          try (BufferedReader inputReader = new BufferedReader(new FileReader(new File(fileName)));
                  CSVParser dataCSVParser = new CSVParser(inputReader, format); ) {

             List<CSVRecord> csvRecords = dataCSVParser.getRecords();

             Map<String, Integer> headerMap = dataCSVParser.getHeaderMap();
              headerList.add(headerMap);
              headerList.forEach(System.out::println);

             for(CSVRecord record : csvRecords){
                 Map<String, String> inputMap = new LinkedHashMap<>();

                 for(Map.Entry<String, Integer> header : headerMap.entrySet()){
                     inputMap.put(header.getKey(), record.get(header.getValue()));
                 }

                 if (!inputMap.isEmpty()) {
                     csvInputList.add(inputMap);
                } 
             }

             csvInputList.forEach(System.out::println);

          } catch (Exception e) {
             System.out.println(e);
          }
    }
}

如果您想将头的读取与文件的其余部分分开,那么可以使用一个只处理第一行的方法和另一个处理文件中所有其他行的方法。很好,非常好
public class CSVFileReaderEx {
    public static void main(String[] args){
        readFile();
    }

    public static void readFile(){
         List<Map<String, String>> csvInputList = new CopyOnWriteArrayList<>();
         List<Map<String, Integer>> headerList = new CopyOnWriteArrayList<>();

         String fileName = "C:/test.csv";
         CSVFormat format = CSVFormat.newFormat(',').withHeader();

          try (BufferedReader inputReader = new BufferedReader(new FileReader(new File(fileName)));
                  CSVParser dataCSVParser = new CSVParser(inputReader, format); ) {

             List<CSVRecord> csvRecords = dataCSVParser.getRecords();

             Map<String, Integer> headerMap = dataCSVParser.getHeaderMap();
              headerList.add(headerMap);
              headerList.forEach(System.out::println);

             for(CSVRecord record : csvRecords){
                 Map<String, String> inputMap = new LinkedHashMap<>();

                 for(Map.Entry<String, Integer> header : headerMap.entrySet()){
                     inputMap.put(header.getKey(), record.get(header.getValue()));
                 }

                 if (!inputMap.isEmpty()) {
                     csvInputList.add(inputMap);
                } 
             }

             csvInputList.forEach(System.out::println);

          } catch (Exception e) {
             System.out.println(e);
          }
    }
}