2016-05-12 94 views
-2

我必須解析csv文件。 列數將是可變的。 我已經爲固定列編寫了以下代碼。 我已經使用csvtobean和MappingStrategy API解析。如何使用opencsv編寫java csv解析器

請幫我我如何動態地創建映射。

公共類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; 
} 

}

回答

0

最後我能解析CSV和它寫在所需的格式一樣

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

如果我理解正確的話,你可以逐行讀取文件中的行,並使用split

讀取示例CSV:來自實例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"); 
    } 

} 

例提取寫一個CSV文件:來自實例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(); 
    } 
    } 
} 

提取不過,我會建議使用一個庫。有許多(例如,opencsv,Apache Commons CSV,Jackson Dataformat CSV等)。你不必重新發明車輪。

  • OPENCSV網站有很多例子可以使用。
  • 如果谷歌「opencsv讀如」你將得到大量的使用OPENCSV庫實例(例如,「解析/讀/寫CSV文件:OpenCSV教程」)

希望這會幫助你! 。

+0

我使用opencsv3.7和使用csvtobean來變換分析CSV到bean,然後ColumnPositionMappingStrategy列mappings.and因爲CSV列可能會有所不同,我無法提供映射。有沒有辦法使用opencsv解析這個csv – coder

+0

你需要使用這麼多的東西嗎?我的意思是,你是否需要使用csvtobean,ColumnPositionMappingStrategy等? 此外,我找到了一個可以幫助您的示例[使用OpenCSV的Java CSV解析器/寫入器示例](http://www.journaldev.com/2544/java-csv-parserwriter-example-using-opencsv-apache-commons -CSV和 - supercsv)。這是另一個例子[用Java讀取/寫入CSV文件](http://viralpatel.net/blogs/java-read-write-csv-file/) – Cagt

0

假設您的代碼有效,我會嘗試將泛型用於setColumnMapping方法。

setType方法獲取參數「Class type」。將此用作您自己的方法setColumnMapping的參數,例如(CSVReader csvReader,Class類型)。通過這種方式,您可以將DataBean2.class傳遞給該方法或任何其他類。此外,您需要一個可變的列映射到bean,因爲如您所知,因爲{「col1」,「col2」,「col3」,「col4」}對於每個bean都是不夠的。考慮如何使這種動態變化(例如,您可以將一個String []傳遞給setColumnMethod)。

你還需要調整你的主內部列表用法顯然。

我建議您在開始編程之前尋找關於java泛型的簡短教程。