1

我有一个 .csv 文件,其中包含以下格式的条目:-

question,option1,option2,option3,option4,answer

我想读取这个 .csv 文件并在表格中插入数据。我正在使用 string.split 方法来执行此操作,它适用于例如:-

   String a="hi,a,b,c,d,e";
    String[] b=a.split(",");

output is:-
b[0]=hi
b[1]=a
b[2]=b
b[3]=c
b[4]=d
b[5]=e

但是当我在两者之间使用空格时,它会给我一个错误:例如:-

String a="hi how are you,a,b,c,d,e";
String[] b=a.split(",");

我在将值存储在数据库中的 servlet 中使用这个概念。这是servlet代码:-

 File file=new File(path2);
        Scanner inputstream=new Scanner(file);
        while(inputstream.hasNext()){
            String data=inputstream.next();
            String[] val=data.split(",");
            String sql4="insert into "+name+"(question,option1,option2,option3,option4,answer) values('"+val[0]+"','"+val[1]+"','"+val[2]+"','"+val[3]+"','"+val[4]+"','"+val[5]+"')";
            s.execute(sql4);
        }

我得到 Array index out of bound 异常。

请帮忙。

谢谢你。:)

4

4 回答 4

2

默认情况下,space是分隔符之一。这使您拥有大量的小数组,而不是只有 5 个元素的数组。因此,如果您假设每行恰好包含 5 个元素,那么您的 ArrayOutOfBounds 。

像这样指定分隔符:

Scanner inputstream=new Scanner(file);
inputstream.useDelimiter("\n");

编辑:此代码向您显示默认分隔符:

Scanner inputstream=new Scanner(file);
System.out.println("Delimiter : "+inputstream.delimiter().toString());

输出 :

\p{javaWhitespace}+

这包括(根据Character#isWhiteSpace(char ch)的 javadoc ):

  • 它是 Unicode 空格字符(SPACE_SEPARATOR、LINE_SEPARATOR 或 PARAGRAPH_SEPARATOR),但也不是不间断空格('\u005Cu00A0'、'\u005Cu2007'、'\u005Cu202F')。
  • 它是'\u005Ct',U+0009 水平制表。
  • 它是'\u005Cn',U+000A LINE FEED。
  • 它是 '\u005Cu000B',U+000B 垂直制表。
  • 它是“\u005Cf”,U+000C 换页。
  • 它是'\u005Cr',U+000D 回车。
  • 它是 '\u005Cu001C',U+001C 文件分隔符。
  • 它是 '\u005Cu001D',U+001D 组分隔符。
  • 它是 '\u005Cu001E',U+001E 记录分隔符。
  • 它是 '\u005Cu001F',U+001F 单位分隔符。
于 2013-10-14T17:19:15.340 回答
1

试试这个代码,

        File file = new File(path2);
    String data = new Scanner(file).useDelimiter("\\A").next();
    String[] val = data.split(",");
    String sql4 = "insert into " + name + "(question,option1,option2,option3,option4,answer) values('" + val[0] + "','" + val[1] + "','" + val[2] + "','"
            + val[3] + "','" + val[4] + "','" + val[5] + "')";
    s.execute(sql4);

如果您正在遍历流,那么您应该在完全读取流之后拆分字符串。在每个周期中拆分它可能不会产生相同的输出,因为您可能还没有完整的数据。

关于使用扫描仪类转换为字符串的更多说明 - Stupid Scanner Tricks

于 2013-10-14T17:18:50.213 回答
0

我不明白错误在哪里。它搜索您作为参数 (',') 传递的分隔符,因此它将您的字符串拆分为:

b[0]=hi how are you
b[1]=a
b[2]=b
b[3]=c
b[4]=d
b[5]=e
于 2013-10-14T16:58:11.973 回答
0

代码似乎没有问题。这很可能与您的 CSV 文件有关。
另外,让我做一个非常愚蠢的猜测,并确认当您以 CSV 格式更改测试用例时,您不会用空格替换逗号,您是……!?
我知道我的猜测很愚蠢,但相信我,我做了非常愚蠢的事情,只能怪我自己:D

PS:我假设您手动更改了 CSV 中的数据“一次”。如果不是这种情况请忽略。

于 2013-10-14T17:16:02.643 回答