我有一个CSV文件,我想将其存储为Java对象。我希望列的名称是数组的第一个维度,键对值是数组的第二个维度。我尝试了不同的解决方案(主要是LinkedHashMaps),但似乎都没有正常工作。
CSV看起来像这样:
TimeStamp;Column 1;Column 2;Column3
1385733406;Value1;Value12;Value13
1385733409;Value21;Value22;Value23
1385733411;Value31;Value32;Value33
我希望数组看起来像这样:
["Column 1"]
["1385733406","Value1"]
["1385733409","Value21"]
["1385733411","Value31"]
["Column 2"]
["1385733406","Value2"]
["1385733409","Value22"]
["1385733411","Value32"]
["Column 3"]
["1385733406","Value2"]
["1385733409","Value22"]
["1385733411","Value33"]
这样,我就可以查询对象并从给定列中检索所有密钥对值,例如,第1列中的所有数据。使用HashMaps似乎不起作用,因为它们需要两个参数,这样做似乎不是正确的方法。这是我到目前为止可以提出的代码,我认为这不是正确的轨道,但这是我能想到的。我正在使用OpenJDK 1.7
public class CsvCollection {
public Map<String,Map<String,Integer>> Results = new LinkedHashMap<String, Map<String,Integer>>();
public CsvCollection(){
}
public void parseCsvResultFile(File csvFile){
CSVReader reader = null;
List myEntries = null;
try {
reader = new CSVReader(new FileReader(csvFile.getAbsolutePath()), ';');
} catch (FileNotFoundException e) {
System.out.println("Error opening [], aborting parsing");
}
try {
myEntries = reader.readAll();
} catch (IOException e) {
System.out.println("Error reading content of CSV file (but file was opened)");
}
for(String header: (String[]) myEntries.get(0)){
Results.put(header, null);
// What now?
}
}
}
答案 0 :(得分:2)
您可以按如下方式进行2次更改,以实现您需要的功能。
1)更改以下代码
public Map<String,Map<String,Integer>> Results = new LinkedHashMap<String, Map<String,Integer>>();
到
public Map<String, List<String[]>> Results = new LinkedHashMap<String, List<String[]>>();
进行此更改是因为对于指定列,例如第1列,它有3行时间戳和相应的列值。您需要使用List来存储它们。
2)更改以下for循环
for(String header: (String[]) myEntries.get(0)){
Results.put(header, null);
// What now?
}
到
String[] headerColumns = (String[]) myEntries.get(0);
// First column is TimeStamp, skip it
for (int i = 1; i < headerColumns.length; i++) {
List<String[]> list = new ArrayList<String[]>();
for (int rowIndex = 1; rowIndex < myEntries.size(); rowIndex++) {
String[] row = (String[]) myEntries.get(rowIndex);
list.add(new String[] { row[0], row[i] });
}
Results.put(headerColumns[i], list);
}
通过以上2次更改,如果您使用以下代码在控制台中打印结果(Map&lt; String,List&lt; String []&gt;&gt;的类型),
for(Map.Entry<String, List<String[]>> entry : Results.entrySet())
{
System.out.printf("[%s]\n",entry.getKey());
for(String[] array : entry.getValue())
{
System.out.println(Arrays.toString(array));
}
}
您将获得所需的结果:
[Column 1]
[1385733406, Value1]
[1385733409, Value21]
[1385733411, Value31]
[Column 2]
[1385733406, Value12]
[1385733409, Value22]
[1385733411, Value32]
[Column3]
[1385733406, Value13]
[1385733409, Value23]
[1385733411, Value33]
注意:上面的示例是使用以下CSV文件中的内容执行的:
TimeStamp;Column 1;Column 2;Column3
1385733406;Value1;Value12;Value13
1385733409;Value21;Value22;Value23
1385733411;Value31;Value32;Value33