Мне нужно разобрать файл csv. количество столбцов будет переменным. Я написал следующий код для фиксированных столбцов. Я использовал apis csvtobean и MappingStrategy для синтаксического анализа.

Пожалуйста, помогите мне, как я могу создавать сопоставления динамически.

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;
}

}

-2
coder 12 Май 2016 в 13:25

3 ответа

Лучший ответ

Наконец, я смог разобрать 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();


}
0
coder 14 Май 2016 в 20:12

Если я правильно понял, вы можете читать файл построчно и использовать 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 есть много примеров, которые вы можете использовать.
  • Если вы погуглите «пример чтения opencsv», вы получите множество примеров с использованием библиотеки OPENCSV (например, «Анализ / чтение / запись файлов CSV: учебник по OpenCSV»)

Надеюсь, это поможет вам !.

1
Cagt 13 Май 2016 в 06:24

Предполагая, что ваш код работает, я бы попытался использовать Generics для метода setColumnMapping.

Метод setType получает параметр «Тип класса». Используйте это как параметр для вашего собственного метода setColumnMapping, например, (CSVReader csvReader, Тип класса). Таким образом, вы можете передать DataBean2.class методу или любому другому классу. Кроме того, вам понадобится переменный столбец для сопоставления bean-компонентов, потому что, как вы знаете, {"col1", "col2", "col3", "col4"} недостаточно для каждого bean-компонента. Подумайте, как сделать это динамическим (например, вы можете передать String [] в setColumnMethod).

Вам также необходимо настроить использование List внутри вашего main.

Я предлагаю поискать краткое руководство по дженерикам Java, прежде чем начинать программировать.

0
YKay 13 Май 2016 в 06:57