我有一个CSV文件,我正在尝试根据其在数组中的位置替换已知数据。
我已将CSV文件拆分为"拆分"阵列。拆分中需要更换的位置在"错误"阵列。
但是,我得到了if(error [i] == i)的ArrayIndexOutOfBounds异常。我知道这是因为split数组与错误数组的长度不同而产生错误。
这周围有吗?
while ((line = in.readLine()) != null)
{
String[] split = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < split.length; i++)
{
int[] error = {0,1,2,3,4,7,8,9,10,11,15,21,34,37,57,61,65,68,69,71,75,79,82,83,85,89,93,96,97,99,103,107,110,111,113,117,121,124,125,127,128,129,130,132,182,210,212,213,214,215,216,222,226,239};
String fix = "ignore_";
if(error[i] == i){
split[i] = fix + i;
}
sb.append(split[i]);
if(i != split.length - 1)
{
sb.append(" ");
}
}
String newline = sb.toString();
printWriter.println(newline);
}
} catch (Throwable t)
{
t.printStackTrace();
}
示例CSV:
"Start Date","End Date","Export App Name","Username","User Last Name",
"User First Name","Response ID","Response Date/Time","Device Date/Time",
"Submission Form Name","Submission Form Version"
此CSV文本根据格式拆分为数组。 &#34;开始日期&#34;是分裂数组的第一个元素,&#34;结束日期&#34;是第二个。
我想举例(基于前两个数字是错误数组)替换&#34;开始日期&#34;和&#34;结束日期&#34;无论我将String定义为什么定义。
因此,在完成循环之后,我希望我的输出为:
"ignore_1","ignore_2","Export App Name","Username","User Last Name",
"User First Name","Response ID","Response Date/Time","Device Date/Time",
"Submission Form Name","Submission Form Version"
答案 0 :(得分:1)
NB:您可以在error
循环之前使用while
数组的声明,它会更好。
<强>解决方案:强>
for
循环以迭代error
数组在for(int i = 0; i < split.length; i++) {
内,就像那样:
for(int j = 0; j < error.length; j++){
if(error[j] == i){
split[i] = fix;
}
}
<强>解释强>
i
数组的每个索引(位置)split
,将检查此索引(位置)是否与error
数组中的元素相对应。答案 1 :(得分:0)
使用HashSet存储感兴趣的列的一种可能性。 HashSet不是遍历查找值的数组,而是提供值的恒定时间查找。
HashSet<Integer> replace = new HashSet<Integer>(
Arrays.asList(0,1)
);
while ((line = in.readLine()) != null) {
String[] split = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);
for(int i = 0; i < split.length; i++) {
if (replace.contains(i)) {
// Do something with the column value.
}
else {
// Leave as is.
}
}
}