2012-06-26 15 views
5

Estoy trabajando en un analizador csv, quiero leer los encabezados y el resto del archivo csv por separado. Aquí está mi código para leer csv.cabezales de lectura del analizador csv

El código actual lee todo en el archivo csv, pero necesito leer los encabezados por separado. por favor ayúdenme con respecto a esto.

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

Si desea separar la lectura de las cabeceras del resto del archivo, a continuación, tienen un método que solo se ocupa de la primera línea, y otro método que controla todas las otras líneas en el archivo. –

Respuesta

3

¿Has considerado OpenCSV?

Pregunta anterior aquí ...

CSV API for Java

parece que se puede dividir la cabecera con bastante facilidad ...

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

Por favor, considere el uso de Commons CSV. Esta biblioteca está escrita de acuerdo con RFC 4180 - Common Format and MIME Type for Comma-Separated Values (CSV) Files. Lo que es compatible para leer estas líneas:

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

Y el uso es bastante simple, sólo hay 3 clases, y una pequeña muestra de acuerdo documentación:

de análisis de un csv-string tiene lengüetas como separadores, " '' como un encapsulador valor opcional, y los comentarios que comienzan con '#':

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

y, además, le sale este analizadores ya están disponibles como constantes:

  • DEFAULT - coma formato separado tipo que se define en el RFC 4180.
  • EXCEL - formato de archivo de Excel (usando una coma como el valor delimitador).
  • MYSQL - Formato MySQL predeterminado utilizado por las operaciones SELECT INTO OUTFILE y LOAD DATA INFILE. TDF - Formato delimitado por tabulación.
3

Tenemos el método Header() disponible en CSVFormat. Si usa esta opción, podrá leer el archivo usando encabezados.

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

le dará todos los encabezados.

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

agradable, muy agradable –