1

FasterXML ライブラリを使用してmy.xmlを解析していCSV fileます。には、最初のCSV file 行に列名があります。残念ながら、列の名前を変更する必要があります。これにはラムダ関数があり、csv filein から赤の値を渡して新しい値を取得できます。

私のコードは次のようになりますが、機能しません。

CsvSchema csvSchema =CsvSchema.emptySchema().withHeader();
ArrayList<HashMap<String, String>> result = new ArrayList<HashMap<String, String>>();       
MappingIterator<HashMap<String,String>> it = new CsvMapper().reader(HashMap.class)
                                                    .with(csvSchema )
                                                    .readValues(new File(fileName));
            
            
            while (it.hasNext()) 
              result.add(it.next());
            
        
            System.out.println("changing the schema columns.");

            for (int i=0; i < csvSchema.size();i++) { 
                
                String name = csvSchema.column(i).getName();
                String newName = getNewName(name);
                csvSchema.builder().renameColumn(i, newName);
                
            }
            csvSchema.rebuild();

後で列を印刷しようとすると、それらはまだ私のCSV file.

csvSchema.size()さらに、それが等しいことに気づきました0-なぜですか?

4

1 に答える 1

2

代わりにuniVocity-parserを使用できます。次のソリューションでは、入力行を出力にストリーミングするため、メモリ内のすべてを読み込んで新しいヘッダーでデータを書き戻す必要はありません。それははるかに高速になります:

public static void main(String ... args) throws Exception{

    Writer output = new StringWriter(); // use a FileWriter for your case

    CsvWriterSettings writerSettings = new CsvWriterSettings(); //many options here - check the documentation
    final CsvWriter writer = new CsvWriter(output, writerSettings);

    CsvParserSettings parserSettings = new CsvParserSettings();  //many options here as well
    parserSettings.setHeaderExtractionEnabled(true); // indicates the first row of the input are headers

    parserSettings.setRowProcessor(new AbstractRowProcessor(){

        public void processStarted(ParsingContext context) {
            writer.writeHeaders("Column A", "Column B", "... etc");
        }

        public void rowProcessed(String[] row, ParsingContext context) {
            writer.writeRow(row);
        }

        public void processEnded(ParsingContext context) {
            writer.close();
        }
    });

    CsvParser parser = new CsvParser(parserSettings);
    Reader reader = new StringReader("A,B,C\n1,2,3\n4,5,6"); // use a FileReader for your case
    parser.parse(reader); // all rows are parsed and submitted to the RowProcessor implementation of the parserSettings.

    System.out.println(output.toString());
    //nothing else to do. All resources are closed automatically in case of errors.
}

parserSettings.selectFields("B", "A")列を並べ替え/削除する場合は、を使用して列を簡単に選択できます。

開示:私はこのライブラリの作成者です。オープンソースで無料です (Apache V2.0 ライセンス)。

于 2015-06-30T20:57:11.150 に答える