我想请求帮助完成这项任务:例如我有CSV:
column1$column2$column3
123$xyz$321
456$zyx$654
我想用Java解析它,所以我会为每一列都有一个数据列表的Hashmap。 例如:
["column1",[123,456]]
["column2",[xyz,zyx]]
["column3",[321,654]]
谢谢大家。
有人已经给我建议如何通过数组列表的数组列表来解决这个任务,但是我想使用Hashmap,所以我可以得到列的索引。我怎么编辑这段代码?
public static void main(String[] args) {
ArrayList<ArrayList<String>> columns = new ArrayList<ArrayList<String>>();
BufferedReader br = null;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader("testing.cvs"));
while ((sCurrentLine = br.readLine()) != null) {
String[] fields = sCurrentLine.split("\\$");
for (int i = 0; i < fields.length; i++) {
if (columns.size()<=i){
columns.add(new ArrayList<String>());
}
columns.get(i).add(fields[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
谢谢大家
答案 0 :(得分:0)
让我在你的时候传递一些代码......
在此解决方案中,我为Maps
- column name
使用了两个values
,为index
- column name
Map<String, List<String>> mappedCols = new HashMap<String, List<String>>();
Map<Integer, String> indexCols = new HashMap<Integer, String>();
BufferedReader br = null;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader("testing.cvs"));
boolean firstLine = true;
while ((sCurrentLine = br.readLine()) != null) {
String[] fields = sCurrentLine.split("\\$");
for (int i = 0; i < fields.length; i++) {
if (firstLine) {
indexCols.put(i, fields[i]);
mappedCols.put(fields[i], new ArrayList<String>());
} else {
String colName = indexCols.get(i);
if (colName == null) {
break;
}
mappedCols.get(colName).add(fields[i]);
}
}
firstLine = false;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
在第一行,我填充索引地图,然后我开始填充它们......
mappedCols
您所追求的结果位于wget -q -O- http://ipecho.net/plain
答案 1 :(得分:0)
未经测试 - 但应该非常接近 -
public static void main(String[] args) {
Map<String, List<String>> columnsMap = new HashMap<>();
BufferedReader br = null;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader("testing.cvs"));
while ((sCurrentLine = br.readLine()) != null) {
String[] fields = sCurrentLine.split("\\$");
for (int i = 0; i < fields.length; i++) {
String columnKey = "column" + (i + 1);
List<String> columnValuesList = columnsMap.get(columnKey);
if (columnValuesList == null) {
columnValuesList = new ArrayList<>();
}
columnValuesList.add(fields[i]);
columnsMap.put(columnKey, columnValuesList);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
答案 2 :(得分:0)
以下解决方案使用列HashMap&gt;它将String作为键(列名),将ArrayList作为值。我已经用n个列和行测试了它并且工作得很好。
markers.push({
latitude: site.latitude,
longitude: site.longitude,
id: 1,
icon: {
url: 'path/to/icon',
origin: origin,
anchor: anchor
},
options: {
shape: {
coords: phaseMarker.coords,
type: "poly"
}
}
});
答案 3 :(得分:0)
使用univocity-parsers&#39; ColumnProcessor
可靠地为您做到这一点:
CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.getFormat().setLineSeparator("\n");
parserSettings.getFormat().setDelimiter('$');
parserSettings.setHeaderExtractionEnabled(true);
// To get the values of all columns, use a column processor
ColumnProcessor rowProcessor = new ColumnProcessor();
parserSettings.setRowProcessor(rowProcessor);
CsvParser parser = new CsvParser(parserSettings);
//This will kick in our column processor
parser.parse(new FileReader("testing.cvs"));
//Finally, we can get the column values:
Map<String, List<String>> columnValues = rowProcessor.getColumnValuesAsMapOfNames();
比手工操作更干净,更快捷,更轻松。这将处理诸如具有不同列数的行之类的情况,并将null
添加到列表中,而不是向您抛出异常。
披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。