如何创建具有动态行的csv文件

时间:2018-07-17 07:37:37

标签: java csv groovy export

我只是不知道如何创建具有动态行的csv文件。 我使用commons-csv向文件写入3行,但还需要更多。

我正在逐行读取数据库中的值,如下所示:

[ID:1,TSP:'2018-01-01 00:10:00', VALUE: 856830, VAL1:'36,704'],
[ID:4,TSP:'2018-01-01 00:12:00', VALUE: 736830, VAL1:'1,14'],
[ID:5,TSP:'2018-01-01 00:10:00', VALUE: 656830, VAL1:'12,504'],
[ID:5,TSP:'2018-01-01 00:50:00', VALUE: 936830, VAL1:'5,18'],
[ID:3,TSP:'2018-01-01 00:10:00', VALUE: 736860, VAL1:'3,4'],
[ID:4,TSP:'2018-01-01 00:50:00', VALUE: 726830, VAL1:'9,14']

我想创建一个.csv文件,其格式如下:

TSP(2018-01-01 00:10:00) | VALUE_ID1 | VAL_ID1 | VALUE_ID3 | VAL_ID3 | VALUE_ID5 | VAL_ID5

TSP(2018-01-01 00:12:00) | VALUE_ID4 | VAL_ID4

TSP(2018-01-01 00:50:00) | VALUE_ID4 | VAL_ID4 | VALUE_ID5 | VAL_ID5

我希望有人能帮我解决这个问题,因为它杀死了我...

谢谢!

编辑:

我在TSP上使用了groupBy,所以现在有以下模式:

TSP(2018-01-01 00:10:00):[[ID:1,TSP(2018-01-01 00:10:00),VALUE_ID1,VAL_ID1], [ID:3,TSP(2018-01-01 00:10:00),VALUE_ID3,VAL_ID3], [ID:5,TSP(2018-01-01 00:10:00),VALUE_ID5,VAL_ID5]]

TSP(2018-01-01 00:12:00):[[ID:4,TSP(2018-01-01 00:10:00),VALUE_ID4,VAL_ID4]]

等那就是我现在被困住的地方–

3 个答案:

答案 0 :(得分:1)

您可以使用以下Java API生成CVS:

两个API都有用于CSV的读/写API API的示例:

我希望使用OpenCSV

答案 1 :(得分:1)

我相信univocity-parsers在这里可以为您提供很大的帮助。检查其教程的this section。您可以这样写行:

File outputFile = new File("/path/to/your.csv");
CsvWriter writer = new CsvWriter(outputFile, new CsvWriterSettings());

String currentTime = null;
for(String[] row : getDataFromYourDatabase()){
    if(row[1].equals(currentTime)){ //check the time signature
        writer.addValue(row[0]); // write the ID on a column
        writer.addValue(row[2]); // write the value associated with the ID on the next column
    } else {
        if(currentTime != null){
             writer.writeValuesToRow(); // generates a row.
        }
        currentTime = row[1];
        writer.addValue(row[1]); //writes the time to the first column of the next row
    }
}

假设方法getDataFromYourDatabase()返回按时间排序的所有行(即看起来像TSP(2018-01-01 00:10:00)的值),这应该很好用。

希望有帮助。

披露:我是这个图书馆的作者。它是开源且免费的(Apache 2.0许可证)

答案 2 :(得分:0)

这是我使用Fuzzy-Csv(https://github.com/kayr/fuzzy-csv/)所能做到的最好的结果

package fuzzycsv

import static fuzzycsv.FuzzyStaticApi.reduce

def data = [[ID: 1, TSP: '2018-01-01 00:10:00', VALUE: 856830, VAL1: '36,704'],
            [ID: 4, TSP: '2018-01-01 00:12:00', VALUE: 736830, VAL1: '1,14'],
            [ID: 5, TSP: '2018-01-01 00:10:00', VALUE: 656830, VAL1: '12,504'],
            [ID: 5, TSP: '2018-01-01 00:50:00', VALUE: 936830, VAL1: '5,18'],
            [ID: 3, TSP: '2018-01-01 00:10:00', VALUE: 736860, VAL1: '3,4'],
            [ID: 4, TSP: '2018-01-01 00:50:00', VALUE: 726830, VAL1: '9,14']]

def list =
        FuzzyCSVTable
                .fromMapList(data)
                .transform('ID') { "VAL_ID${it.ID}" }
                .transform('TSP') { "TSP_(${it.TSP})" }
                .summarize('TSP', reduce { it['ID'] }.az('IDS'))
                .with { tbl(csv.collect { it.flatten() }[1..-1]) }


println(list.toCsvString())

输出

"TSP_(2018-01-01 00:10:00)","VAL_ID1","VAL_ID5","VAL_ID3"
"TSP_(2018-01-01 00:12:00)","VAL_ID4"
"TSP_(2018-01-01 00:50:00)","VAL_ID5","VAL_ID4"