我使用以下代码读取CSV文件:
String next[] = {};
List<String[]> dataArray = new ArrayList<String[]>();
try {
CSVReader reader = new CSVReader(new InputStreamReader(getAssets().open("inputFile.csv")));
for(;;) {
next = reader.readNext();
if(next != null) {
dataArray.add(next);
} else {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
这会将CSV文件转换为数组'dataArray'。我的应用程序是一个字典类型的应用程序 - 输入数据的第一列是单词列表,第二列是这些单词的定义。以下是加载的数组示例:
Term 1, Definition 1
Term 2, Definition 2
Term 3, Definition 3
为了访问数组中的一个字符串,我使用以下代码:
dataArray.get(rowNumber)[columnNumber]
但是,我需要能够生成所有术语的列表,以便可以为词典应用程序显示它们。据我了解,访问列本身比访问行要长得多(我来自MATLAB背景,这很简单)。
似乎为了能够随时访问输入数据的任何一行,我最好转置数据并以这种方式读取数据;即:
Term 1, Term 2, Term3
Definition 1, Definition 2, Definition 3
当然,我可以提供一个首先转置的CSV文件 - 但Excel或OO Calc不允许超过256行,而我的词典包含大约2000个术语。
欢迎以下任何一种解决方案:
答案 0 :(得分:3)
使用地图数据结构(例如HashMap)可能会更好:
String next[] = {};
HashMap<String, String> dataMap = new HashMap<String, String>();
try {
CSVReader reader = new CSVReader(new InputStreamReader(getAssets().open("inputFile.csv")));
for(;;) {
next = reader.readNext();
if(next != null) {
dataMap.put(next[0], next[1]);
} else {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
然后您可以通过
访问第一列dataMap.keySet();
和第二列
dataMap.values();
请注意这里的一个假设:输入数据的第一列是所有唯一值(即“术语”列中没有重复的值)。
为了能够以数组的形式访问键(术语),您可以按照以下步骤操作:
String[] terms = new String[dataMap.keySet().size()];
terms = dataMap.keySet().toArray(terms);
答案 1 :(得分:2)
如果每一行都有两个值,其中第一行是术语,第二行是定义,你可以像这样构建一个Map
(顺便说一句,这个while
循环就是与for
循环完全相同的东西:
String next[] = {};
Map<String, String> dataMap = new HashMap<String, String>();
try {
CSVReader reader = new CSVReader(new InputStreamReader(getAssets().open("inputFile.csv")));
while((next = reader.readNext()) != null) {
dataMap.put(next[0], next[1]);
}
} catch (IOException e) {
e.printStackTrace();
}
然后你可以通过以下方式从术语中获得定义:
String definition = dataMap.get(term);
或所有这样的定义:
for (String term: dataMap.keySet()) {
String definition = dataMap.get(term);
}