如何使用opencsv编写java csv解析器

时间:2016-05-12 10:25:58

标签: java csv opencsv

我必须解析csv文件。 列数可变。 我已经为固定列编写了以下代码。 我使用csvtobean和MappingStrategy apis进行解析。

请帮助我如何动态创建映射。

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

}

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以逐行阅读文件并使用split

示例READ 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网站有很多可以使用的例子。
  • 如果您使用Google“opencsv阅读示例”,您将获得使用OPENCSV库的大量示例(例如,“解析/读取/写入CSV文件:OpenCSV教程”)

希望这会对你有所帮助!

答案 1 :(得分:0)

假设您的代码有效,我会尝试将Generics用于setColumnMapping方法。

方法setType获取参数“类类型”。将此作为您自己的方法setColumnMapping的参数,例如,(CSVReader csvReader,Class type)。这样,您可以将DataBean2.class传递给方法或任何其他类。此外,您需要一个变量列到bean映射,因为{“col1”,“col2”,“col3”,“col4”}对于每个bean来说都不够,如您所知。考虑一下如何使其动态化(例如,您可以将String []传递给setColumnMethod。)

您还需要调整主要内部的列表使用情况。

我建议您在开始编程之前先找一些关于java泛型的简要教程。

答案 2 :(得分: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();


}
相关问题