csv 文件包含多个表,它可能如下所示:
"Vertical Table 1" , "id","visits","downloads" 1, 4324, 23 2, 664, 42 3, 73, 44 4, 914, 8 "Vertical Table 2" , "id_of_2nd_tab","visits_of_2nd_tab","downloads_of_2nd_tab" 1, 524, 3 2, 564, 52 3, 63, 84 4, 814, 8
要读取一个表,我使用 opencsv 中的“HeaderColumnNameTranslateMappingStrategy” 它允许我将 csv 表条目映射到 TableDataBean 对象列表中,如下所示:
HeaderColumnNameTranslateMappingStrategy<TableDataBean> strat = new HeaderColumnNameTranslateMappingStrategy<TableDataBean>(); CSVReader reader = new CSVReader(new FileReader(path), ','); strat.setType(TableDataBean.class); Map<String, String> map = new HashMap<String, String>(); map.put("Number of visits", "visits"); map.put("id", "id"); map.put("Number of downloads", "downloads"); strat.setColumnMapping(map); CsvToBean<TableDataBean> csv = new CsvToBean<TableDataBean>(); List<TableDataBean> list = csv.parse(strat, reader);
这对于第一个表来说效果很好,但是当涉及到第二个表时,值和属性将映射到第一个表的相同属性。输出为
for(TableDataBean bean : list){System.out.println(bean.getVisits());}
看起来像这样:
4324 664 73 914 null null null visits_of_2nd_tab 524 564 63 814
我不想将文件拆分为许多文件,每个文件包含一个表。 所以你有什么建议 ?还有其他库支持这种格式吗?
最佳答案
我明白了!我认为reader的类型必须是CSVReader。事实上,我可以为方法 parse 提供继承自 Reader 类的任何对象。
现在我可以将整个 csv 文件读入字符串,将其拆分,将每个新字符串打包到 StringReader 中,然后将其传递给 parse 方法。
关于java - 包含许多表的 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9048256/