我是基础级Java程序员。我正在使用CSV文件。我有一个包含行和列的文件,如下所示:
col1 col2 col3
row1
row2
row3
我读取此文件并将其存储在String中。我使用换行符爆炸字符串来获取每一行。我有一个变量ArrayList,它有一些行名。我怎样才能比较它只返回特定的行?
答案 0 :(得分:2)
正确解析CSV文件比初看起来更棘手,至少需要:
如果这是一项快速任务,我建议使用现有的库,至少有两个用于Java的开源CSV库,其API非常相似:
我已经尝试过从OpenCSV开始,并且因为我有一个600MB的CSV文件,因此只是逐行评估文件时抛出了OutOfMemory异常。显然当前的lib中存在内存泄漏。
我没有时间进行调试,因此我只是切换到Java CSV,因为它具有令人惊讶的类似API的基本操作,它就像一个魅力。
Java CSV允许您通过索引或列名访问列(如果文件中有标题)。
<强>更新强>
使用Java CSV Lib,您必须沿着这些行执行某些操作才能访问各行(quick'n'dirty,可能无法编译):
import com.csvreader.CsvReader;
class Parser {
public static void main (String [] args) throws Throwable {
CsvReader reader = new CsvReader("input file name.csv",
',' /* delimiter */ );
while (reader.readRecord()) {
// full row, you can use regex to find
// any rows you specifically want
String row = reader.getRawRecord();
// get value of the first field
String col = reader.get(0);
// gets array of fields
String[] cols[] = reader.getValues();
}
reader.close();
}
}
答案 1 :(得分:0)
处理此问题的最佳方法是为每一行创建一个新条目,并将这些行存储为类似Vector<Row>
将每个新字符串拆分为Row对象,其中包含Row.col1,Row.col2等字段...(请选择更好的名称= P)
然后您可以迭代Vector并仅选择与您相关的那些
答案 2 :(得分:0)
首先,您最好分别阅读每一行而不是整个文件作为字符串。由于这是一个文本文件,您可以逐行阅读。谷歌的类似“Java逐行读取文件”,你会发现很多例子。
现在,在每一行中,您可以通过空格或逗号将行拆分为组件。你说它是一个CSV文件所以我常常会看到逗号,这样你就可以处理空单元格。
如果您读取第一行(列标题)并将每列的位置存储为数组的Map,则可以在每个后续行中找到适当的值。例如,您可以将每一行表示为从列名称到单元格值的映射。
我不清楚你的意思是“如何比较它只返回我特定的行?”,但听起来你想要过滤行并打印出来。在这种情况下,除了当前行之外,不需要在内存中存储任何内容,只需逐行迭代并打印,如果它通过了您想要应用的任何检查。如果您确实要存储所有行,请使用类似向量或列表的内容,但请注意,如果这是一个非常大的文件并且许多行都通过了检查,则可能没有足够的内存。