-1

我想以下列方式将数据逐列写入/附加到 CSV 文件:

    query1       query2       query3
    data_item1   data_item7   data_item12
    data_item2   data_item8   data_item13
    data_item3   data_item9   data_item14
    data_item4   data_item10 
    data_item5   data_item11
    data_item6  

我在 hashMap 中有数据,其中 queryID(即 query1、query2)是键,相应查询的 data_items 是值。值(每个查询的数据项)在一个列表中。因此,我的哈希图如下所示:

HashMap<String,List<String>> hm = new HashMap<String,List<String>>();

如上所示,如何使用 JAVA 将这些数据逐列写入 csv?我试过 CSVWriter,但做不到。谁能帮帮我?

4

2 回答 2

0

折腾了几天,终于成功了。这是实现:

for(int k=0;k<maxRows;k++) {
            List<String> rowValues  = new ArrayList<String>();
            for(int i=0;i<queryIdListArr.length;i++) {
                subList = qValuesList.subList(i, i+1);
                List<String> subList2 = subList.stream().flatMap(List::stream).collect(Collectors.toList());
                if(subList2.size()<=k) {
                    rowValues.add("");
                }else{
                    rowValues.add(subList2.get(k));
                }

            }
            String[] rowValuesArr = new String[rowValues.size()];
            rowValuesArr = rowValues.toArray(rowValuesArr); 
//          System.out.println(rowValues);
            writer.writeNext(rowValuesArr);
        }

maxRows :具有最大大小的值列表的大小。我有每个键的值列表。我的哈希图看起来像这样

 HashMap<String,List<String>> hm = new HashMap<String,List<String>>();

queryIdListArr :从哈希映射中获得的所有值的列表。

qValuesList :所有值列表的列表。

List<List<String>> qValuesList = new ArrayList<List<String>>();

subList2 :使用以下语法从 qValuesList 获得的子列表:

qValuesList.subList(i, i+1);

rowValuesArr 是一个数组,其中填充了从 qValuesList 获取的每个值的索引值。这个想法是从所有子列表中获取每个索引的所有值,然后将这些值写入行。如果该索引没有找到值,则写入一个空白字符。

于 2020-02-27T08:31:17.830 回答
0

csv 文件主要用于保存像表格一样结构化的数据......这意味着数据的列和行处于紧密的上下文中。

在您的示例中,query1、2 和 3 之间似乎只有非常松散的连接,而项目 1,7 和 12 或 2、8 和 13 等之间没有水平连接。

除此之外,通常沿着行或行促进写入文件。所以你打开你的文件写一行,然后再写一行,依此类推。

因此,要按照您的要求逐列写入数据,您必须在代码中重新构造数据,以使写入一行的所有数据在写入该行时可用,或者运行您的 csv 文件和它的行数次,每次将另一个项目添加到行中。当然,后一种选择非常耗时,而且没有多大意义。

因此,我建议如果 3 个查询的数据之间真的没有联系,您可以将数据写入 3 个不同的 csv 文件:query1.csv、2.csv 和 3.csv。

或者,如果您有水平连接,即项目 1,7 和 12 之间,依此类推,您将其写入一个 csv 文件,将数据组织成行和列。就像是:

queryNo     columnX     columnY     columnZ
1           item1       item2       item3
2           item7       item8       item9
3           item12      item13      item14 

此线程中很好地描述了如何做到这一点:Java - 将字符串写入 CSV 文件。您还可以在此处找到其他示例https://mkyong.com/java/how-to-export-data-to-csv-file-java/

于 2020-02-21T09:33:19.040 回答