我试图读取csv并将记录存储在ArrayList中。 因为我知道没有。 csv文件中的记录我在创建对象时指定大小,即600。 我希望程序能够读取未知的文件。的记录。 如何让它变得动态。
这是包含600条记录的文件的工作代码。
ORA-12560: TNS:Protocol adapter error.
}
答案 0 :(得分:0)
您无需事先知道记录数量即可使用ArrayList
。您可以在构造函数中指定默认大小,但是如果添加的记录多于此值,则它足够智能扩展自己。
答案 1 :(得分:0)
ArrayList可以动态生成元素,因此不需要事先知道大小。
但是,对于BankRecords
数组,最初不要使用600初始化它。而是做这样的事情:
static BankRecords[] obj = null;
static List<List<String>> array = new ArrayList<List<String>>();
void processData() {
// TODO Auto-generated method stub
obj=new BankRecords[array.size()];
// TODO do your work here
}
答案 2 :(得分:0)
你几乎就在那里,但由于一些奇怪的原因,你在已有阵列的地方使用列表;但另一方面,你正在使用一个数组,其中List更适合。
您可以按如下方式重新编写代码:
// TODO Auto-generated method stub
提示:这些TODO由IDE生成。我们的想法是,只要您拥有一些真实内容,就删除。保留它们意味着在源代码中留下垃圾。任何不会给您的源代码带来实际价值的东西:删除它。总是。立即!
String line=" ";
List<Bankrecord> records = new ArrayList<>();
//int i=0; ... again: unused code --- remove that!
try(BufferedReader br = new BufferedReader(new FileReader("bank-Detail.csv"))){
while((line=br.readLine()) != null) //read from file
{
String[] lineData = line.split(",");
BankRecord recordForNewLine = buildRecordFrom(lineData);
records.add(recordForNewLine);
} ...
然后你可以将 processData 重写为:
private BankRecord buildRecordFrom(String[] lineData) {
BankRecord newRecord = new BankRecords();
newRecord.setId(lineData[0];
...
return newRecord;
}
你应该考虑改变的事情:
最后:我上面的代码意味着让你前进的“灵感点”。不要盲目地复制/粘贴它;可能会出现各种错别字 - 只要阅读它就会得到它正在做什么(以及为什么)(它正在做什么)!
然后:我希望您理解真实 CSV解析比拆分“,”更复杂(例如:CSV数据中的字符串也可以包含',';然后您的简单拆分撕掉那串!) 如果您认真解析现实世界中其他人的CSV输入,那么最好使用现有的库来为您完成此操作。编写正确 CSV解析器很难工作(并且不是很有价值;因为这意味着无缘无故重新发明一个复杂的轮子)!