在JAVA中按列向CSV文件写入/追加数据

在JAVA中按列向CSV文件写入/追加数据,java,csv,hashmap,csvreader,Java,Csv,Hashmap,Csvreader,我想以以下方式将数据逐列写入/附加到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

我想以以下方式将数据逐列写入/附加到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)是 对应的查询是值。 值(每个查询的数据项)位于列表中。 因此,我的哈希映射如下所示:

HashMap<String,List<String>> hm = new HashMap<String,List<String>>();
HashMap hm=newhashmap();
如何使用JAVA将这些数据逐列写入csv(如上所示)?
我试过CSVWriter,但做不到。谁能帮帮我吗

csv文件主要用于保存像表格一样结构化的数据。。。表示具有紧密上下文中的列和行的数据

在您的示例中,查询1、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 
如何做到这一点在本线程中有详细描述:。
你也可以在这里找到其他例子

经过几天的修补,我终于成功了。以下是实施方案:

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);
        }
rowValuesArr是一个数组,为每个数组填充索引值 从qValuesList获取的值。
其思想是从所有子列表中获取每个索引的所有值,然后将这些值写入该行。如果找不到该索引的值,请写一个空白字符

1)CSV文件是一个文本文件,您必须逐行写入数据,因此无法实现逐列写入的愿望。如果您的意思是要在列中布局数据,则必须以这种方式组织数据,并逐行写入。--2) 为什么要尝试使用CSVReader来写入数据?你想用哪个CSV库?我用的是CSVWriter,我的意思是CSVWriter,错误地写了“csvreader”,抱歉。你需要CSV库吗?或者你会喜欢其他格式吗?我认为将这些数据存储为json可能是一个不错的选择。要求仅为CSV格式。
 HashMap<String,List<String>> hm = new HashMap<String,List<String>>();
List<List<String>> qValuesList = new ArrayList<List<String>>();
qValuesList.subList(i, i+1);