2016-05-12 5 views
-2

Ich muss csv-Datei analysieren. Anzahl der Spalten wäre variabel. Ich habe folgenden Code für feste Spalten geschrieben. Ich habe csvtobean und MappingStrategy API für die Analyse verwendet.Wie schreibe ich Java CSV-Parser mit opencsv

Bitte helfen Sie mir, wie ich Mappings dynamisch erstellen kann.

public class OpencsvExecutor2 {

public static void main(String[] args) throws IOException { 
    // TODO Auto-generated method stub 

    CsvToBean csv = new CsvToBean(); 
    String csvFilename="C:\\Users\\ersvvwa\\Desktop\\taks\\supercsv\\20160511-0750--MaS_GsmrRel\\20160511-0750--MaS_GsmrRel.txt"; 
    CSVReader csvReader = null; 
    List objList=new ArrayList<DataBean>(); 
    try { 


     FileInputStream fis = new FileInputStream(csvFilename);  
     BufferedReader myInput = new BufferedReader(new InputStreamReader(fis));    

     csvReader = new CSVReader(new InputStreamReader(new FileInputStream(csvFilename), "UTF-8"), ' ', '\'', 1); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    csvReader.getRecordsRead(); 
    //Set column mapping strategy 
     List<DataBean> list = csv.parse(setColumMapping(csvReader), csvReader); 
     for (Object object : list) { 
      DataBean obj = (DataBean) object; 
     // System.out.println(obj.Col1); 
      objList.add(obj); 
     } 

     csvReader.close(); 

     System.out.println("list size "+list.size()); 
     System.out.println("objList size "+objList.size()); 
     String outFile="C:\\Users\\ersvvwa\\Desktop\\taks\\supercsv\\20160511-0750--MaS_GsmrRel\\20160511-0750--MaS_GsmrRel.csv"; 
     try { 

     CSVWriter csvWriter = null; 
     csvWriter = new CSVWriter(new FileWriter(outFile),CSVWriter.DEFAULT_SEPARATOR,CSVWriter.NO_QUOTE_CHARACTER); 
     //csvWriter = new CSVWriter(out,CSVWriter.DEFAULT_SEPARATOR,CSVWriter.NO_QUOTE_CHARACTER); 
     String[] columns = new String[] {"col1","col2","col3","col4"}; 
     // Writer w= new FileWriter(out); 

     BeanToCsv bc = new BeanToCsv();  

     List ls; 
     csvWriter.writeNext(columns); 



     //bc.write(setColumMapping(), csvWriter, objList); 
     System.out.println("complete"); 
     csvWriter.close(); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

private static MappingStrategy setColumMapping(CSVReader csvReader) throws IOException { 
    // TODO Auto-generated method stub 
    ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy(); 
     strategy.setType(DataBean2.class); 
     String[] columns = new String[] {"col1","col2","col3","col4"}; 
     strategy.setColumnMapping(columns); 


     return strategy; 
} 

}

Antwort

0

Schließlich war ich in der Lage csv zu analysieren und sie in gewünschtem Format zu schreiben wie

csvWriter = new CSVWriter(new FileWriter(outFile),CSVWriter.DEFAULT_SEPARATOR,CSVWriter.NO_QUOTE_CHARACTER); 
    csvReader = new CSVReader(new InputStreamReader(new FileInputStream(csvFilename), "UTF-8"), ' '); 
    String header = "NW,MSC,BSC,CELL,CELL_0"; 
    List<String> headerList = new ArrayList<String>(); 
    headerList.add(header); 
    csvWriter.writeNext(headerList.toArray(new String[headerList.size()])); 
    while ((nextLine = csvReader.readNext()) != null) { 
     // nextLine[] is an array of values from the line 

     for(int j=0;j< nextLine.length;j++){ 
      // System.out.println("next " +nextLine[1]+" "+nextLine [2]+ " "+nextLine [2]); 
      if(nextLine[j].contains("cell")|| 
        nextLine[j].equalsIgnoreCase("NW") || 
        nextLine[j].equalsIgnoreCase("MSC") || 
        nextLine[j].equalsIgnoreCase("BSC") || 
        nextLine[j].equalsIgnoreCase("CELL")){ 
       hm.put(nextLine[j], j); 
      } 

     } 

     break; 
    } 

    String[] out=null; 

    while ((row = csvReader.readNext()) != null) { 

     String [] arr=new String[4]; 

     outList = new ArrayList<>(); 
     innerList = new ArrayList<>(); 
     finalList=new ArrayList<String[]>(); 
     String[] str=null; 

     int x=4; 
     for(int y=0; y<hm.size()-10;y++){    

      if(!row[x].equalsIgnoreCase("NULL")|| !row[x].equals(" ")){ 
       System.out.println("x "+x); 
       str=new String[]{row[0],row[1],row[2],row[3],row[x]}; 
      } 

      finalList.add(str);; 

      x=x+3; 

     } 
     csvWriter.writeAll(finalList); 

     break; 


    } 

    csvReader.close(); 
    csvWriter.close(); 


} 
1

Wenn ich richtig verstanden habe, können Sie die Datei Zeile für Zeile lesen und split verwenden.

Beispiel READ CSV: Beispiel aus extrahiert mkyong

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 

public class ReadCVS { 

    public static void main(String[] args) { 

    ReadCVS obj = new ReadCVS(); 
    obj.run(); 

    } 

    public void run() { 

    String csvFile = "/Users/mkyong/Downloads/GeoIPCountryWhois.csv"; 
    BufferedReader br = null; 
    String line = ""; 
    String cvsSplitBy = ","; 

    try { 

    br = new BufferedReader(new FileReader(csvFile)); 
    while ((line = br.readLine()) != null) { 

      // use comma as separator 
     String[] country = line.split(cvsSplitBy); 

     System.out.println("Country [code= " + country[4] 
           + " , name=" + country[5] + "]"); 

    } 

    } catch (FileNotFoundException e) { 
    e.printStackTrace(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } finally { 
    if (br != null) { 
     try { 
     br.close(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 
    } 

    System.out.println("Done"); 
    } 

} 

Beispiel für WRITE eine CSV-Datei: Beispiel aus mkyong

import java.io.FileWriter; 
import java.io.IOException; 

public class GenerateCsv 
{ 
    public static void main(String [] args) 
    { 
    generateCsvFile("c:\\test.csv"); 
    } 

    private static void generateCsvFile(String sFileName) 
    { 
    try 
    { 
     FileWriter writer = new FileWriter(sFileName); 

     writer.append("DisplayName"); 
     writer.append(','); 
     writer.append("Age"); 
     writer.append('\n'); 

     writer.append("MKYONG"); 
     writer.append(','); 
     writer.append("26"); 
      writer.append('\n'); 

     writer.append("YOUR NAME"); 
     writer.append(','); 
     writer.append("29"); 
     writer.append('\n'); 

     //generate whatever data you want 

     writer.flush(); 
     writer.close(); 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 
    } 
} 

jedoch extrahiert, würde ich empfehlen, eine Bibliothek zu verwenden. Es gibt viele (z. B. opencsv, Apache Commons CSV, Jackson Datenformat CSV, usw.). Sie müssen das Rad nicht neu erfinden.

  • OPENCSV Website hat viele Beispiele, die Sie verwenden können.
  • Wenn Sie Google „Beispiel opencsv lesen“ Sie werden eine Menge von Beispielen unter Verwendung der OPENCSV Bibliothek (zB „Parse/Lesen/Schreiben von CSV-Dateien: OpenCSV Tutorial“) erhalten

Hoffentlich würde Ihnen helfen! .

+0

i opencsv3.7 verwenden und csvtobean mit csv in Bean tranform und dann ColumnPositionMappingStrategy für Spalte mappings.and weil Spalten von csv kann in Zahlen variieren Ich bin nicht in der Lage, Mapping bereitzustellen. Gibt es eine Möglichkeit, diese CSV mit opencsv zu analysieren – coder

+0

Es ist erforderlich für Sie arbeiten, so viele Dinge zu verwenden? Ich meine, müssen Sie csvtobean, ColumnPositionMappingStrategy, etc ?. Darüber hinaus fand ich ein Beispiel, das Ihnen helfen kann [Java CSV Parser/Writer Beispiel mit OpenCSV] (http://www.journaldev.com/2544/java-csv-parserwriter-example-using-opencsv-apache-commons -csv-und-supercsv).Hier ist ein weiteres Beispiel [CSV-Datei in Java lesen/schreiben] (http://viralpatel.net/blogs/java-read-write-csv-file/) – Cagt

0

Angenommen, dass Ihr Code funktioniert, würde ich versuchen, Generics für die setColumnMapping-Methode zu verwenden.

Die Methode setType erhält einen Parameter "Klassentyp". Verwenden Sie dies als Parameter für Ihre eigene Methode setColumnMapping, z. B. (CSVReader csvReader, Klassentyp). Auf diese Weise können Sie die DataBean2.class an die Methode oder eine andere Klasse übergeben. Außerdem benötigen Sie eine variable Zuordnung von Spalte zu Bean, da {"col1", "col2", "col3", "col4"}, wie Sie wissen, nicht für jede Bean ausreicht. Überlegen Sie, wie Sie diese dynamisch machen können (Sie können String [] beispielsweise an setColumnMethod übergeben).

Sie müssen auch Listenverwendung in Ihrem Haupt offenbar anpassen.

Ich schlage vor, dass Sie nach einem kurzen Tutorial über Java Generics suchen, bevor Sie mit der Programmierung beginnen.

Verwandte Themen