繁体   English   中英

使用string.split方法读取.csv文件

[英]Reading a .csv file using string.split method

我有一个.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);
        }

我得到的数组索引超出了绑定异常。

请帮忙。

谢谢。 :)

默认情况下, 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 HORIZONTAL TABULATION。
  • 这是'\\ u005Cn',U + 000A LINE FEED。
  • 这是'\\ u005Cu000B',U + 000B VERTICAL TABULATION。
  • 这是'\\ u005Cf',U + 000C FORM FEED。
  • 这是'\\ u005Cr',U + 000D CARRIAGE RETURN。
  • 它是'\\ u005Cu001C',U + 001C FILE SEPARATOR。
  • 它是'\\ u005Cu001D',U + 001D GROUP SEPARATOR。
  • 这是'\\ u005Cu001E',U + 001E RECORD SEPARATOR。
  • 它是'\\ u005Cu001F',U + 001F UNIT SEPARATOR。

试试这段代码,

        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);

如果要迭代流,则应在完全读取流后拆分字符串。 因为您可能还没有完整数据,因此在每个周期中拆分它可能不会产生相同的输出。

关于使用scanner类转换为字符串的更多解释 - 愚蠢的扫描程序技巧

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

b[0]=hi how are you
b[1]=a
b[2]=b
b[3]=c
b[4]=d
b[5]=e

代码似乎没有问题。 最有可能是您的CSV文件。
另外,让我做一个非常愚蠢的猜测,并确认在以CSV格式更改测试用例时,您不是用空格替换逗号,是吗......!?
我知道我正在做一个非常愚蠢的猜测,但相信我,我已经做了非常愚蠢的事情而且我只能责怪它:D

PS:我假设您手动更改CSV中的数据'一次'。 如果不是这样,请忽略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM