2012-06-26 87 views
5

我正在處理csv解析器,我想分別讀取頭文件和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(); 
    } 
} 
+1

如果您想要將文件頭的讀取與文件的其餘部分分開,則需要一個只處理第一行的方法,另一個方法處理文件中的所有其他行。 –

回答

3

你認爲是OpenCSV

這裏前一個問題...

CSV API for Java

貌似可以很容易打出頭...

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

請考慮使用Commons CSV。該庫根據RFC 4180 - Common Format and MIME Type for Comma-Separated Values (CSV) Files編寫。什麼是兼容的讀取這樣的臺詞:

"aa,a","b""bb","ccc" 

而且使用相當簡單,僅存在3類,並根據小樣本文檔:

有標籤爲CSV串的解析分離器,「'作爲一個可選的 值封裝和評論以‘#’:

CSVFormat format = new CSVFormat('\t', '"', '#'); 
Reader in = new StringReader("a\tb\nc\td"); 
String[][] records = new CSVParser(in, format).getRecords(); 

,另外你得到這個解析器已經作爲常量:

  • DEFAULT - 如RFC 4180
  • EXCEL定義標準逗號分隔格式 - Excel文件格式(使用逗號作爲值的分隔符)。
  • MYSQL - SELECT INTO OUTFILE和LOAD DATA INFILE操作使用的默認MySQL格式。 TDF - 製表分隔格式。
3

我們在CSVFormat中提供了withHeader()方法。如果你使用這個選項,那麼你將能夠使用頭文件讀取文件。

CSVFormat format = CSVFormat.newFormat(',').withHeader(); 
Map<String, Integer> 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); 
      } 
    } 
} 
+0

不錯,真的很不錯 –