3

我正在使用以下代码读取 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 背景,这很简单)。

似乎为了随时访问我的输入数据的任何行,我最好转置数据并以这种方式读取它;IE:

Term 1, Term 2, Term3
Definition 1, Definition 2, Definition 3

当然,我可以首先提供一个转置的 CSV 文件——但 Excel 或 OO Calc 不允许超过 256 行,而我的字典包含大约 2000 个术语。

欢迎以下任何解决方案:

  • 一种在读入数组后转置数组的方法
  • 对上面发布的代码的更改,使其以“转置”方式读取数据
  • 读取整个数组的整个列的简单方法
4

2 回答 2

3

使用 Map 数据结构(例如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);
于 2012-08-26T20:32:11.990 回答
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);
}
于 2012-08-26T20:32:30.110 回答