2012-06-26 16 views
5

Sto lavorando su un parser csv, voglio leggere le intestazioni e il resto del file csv separatamente. Ecco il mio codice per leggere csv.parser csv che legge le intestazioni

Il codice corrente legge tutto nel file csv, ma ho bisogno di leggere le intestazioni separate. per favore aiutatemi riguardo a questo.

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

Se si desidera separare la lettura delle intestazioni dal resto del file, quindi disporre di un metodo che gestisce solo la prima riga e un altro metodo che gestisce tutte le altre righe nel file. –

risposta

3

Avete considerato OpenCSV?

domanda precedente qui ...

CSV API for Java

Sembra che è possibile dividere il colpo di testa abbastanza facilmente ...

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

perche l'uso di Commons CSV. Questa libreria è scritta secondo RFC 4180 - Common Format and MIME Type for Comma-Separated Values (CSV) Files. Ciò che è compatibile a leggere queste righe:

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

E l'uso è molto semplice, ci si trova a soli 3 classi, e la documentazione di un piccolo campione secondo:

analisi di una csv-stringa di avere schede come separatori, '"' come un incapsulatore valore opzionale, e commenti che iniziano con '#':

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

e inoltre si ottiene questo parser già disponibili come costanti:

  • DI DEFAULT - virgole standard formato separati come definito dalla RFC 4180.
  • EXCEL - formato di file di Excel (utilizzando una virgola come delimitatore di valore).
  • MYSQL - Formato MySQL predefinito utilizzato dalle operazioni SELECT INTO OUTFILE e LOAD DATA INFILE. TDF - Formato delimitato da tabulazione.
3

Abbiamo il metodo withHeader() disponibile in CSVFormat. Se si utilizza questa opzione, sarà possibile leggere il file utilizzando le intestazioni.

CSVFormat format = CSVFormat.newFormat(',').withHeader(); 
Map<String, Integer> headerMap = dataCSVParser.getHeaderMap(); 

vi darà tutte le intestazioni.

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

bello, davvero bello –

Problemi correlati