处理带有空的final字段的csv String时,myString.split(",")返回的数组条目数不正确

reo*_*eor 8 java string android split string-split

我正在处理从.csv文件中读取的某一行,String.split(",")并发现最后一个分隔符之后的最后一个空字符串没有进入该split函数创建的数组.

以下是导致错误的变量值:

String toSplit = "1,Some Value,31337,Another Value,";
String[] values = toSplit.split( "," );
Run Code Online (Sandbox Code Playgroud)

values阵列最终具有少于预期的数组条目数.创建的数组是:

values[0] : '1'
values[1] : 'Some Value'
values[2] : '31337'
values[3] : 'Another Value'
Run Code Online (Sandbox Code Playgroud)

values[4]抛出异常的ArrayIndexOutOfBounds.

我想要的数组是:

values[0] : '1'
values[1] : 'Some Value'
values[2] : '31337'
values[3] : 'Another Value'
values[4] : ''
Run Code Online (Sandbox Code Playgroud)

一个警告:我正在读取另一个.csv文件创建者的输出,并且不想使用字符串分隔符或将"空白字符"放入数据为空的位置.(即不想:最后toSplit = "1,Some Value,31337,Another Value, "有空格.)

这是String.split()中的错误,是否有解决方法/另一个选项?

reo*_*eor 13

当我输入问题时想出来!使用stringObj.split(",",numDelimitersExpected)或者,如@Supericy指出的那样,stringObj.split (",", - 1).

根据关于stringObj.split(delimiter)的Android文档,调用line.split( "," )相当于line.split( ",", 0 )使用第二个参数引用的调用limit,它设置' 最大条目数 '并定义' 尾随空字符串处理 '.查看stringObj.split(delimiter)的文档,它指出limit == 0' 不会返回 ' 尾随空字符串 '.

该解决方案是使用调用split( ",", limit )limit设置到你希望找回阵列条目数.在我的情况下,限制设置为5将返回数组

values[0] : '1'
values[1] : 'Some Value'
values[2] : '31337'
values[3] : 'Another Value'
values[4] : ''
Run Code Online (Sandbox Code Playgroud)

这正是我想要的. 问题解决了.

实际上,即使你的toSplit字符串的分隔符数少于分隔符limit,使用set的调用limit仍然会创建最多的空数组条目limit.例如,使用与我的问题相同的输入字符串:

String toSplit = "1,Some Value,31337,Another Value,"
Run Code Online (Sandbox Code Playgroud)

一个调用String values[] = toSplit.split( ",", 8 )返回数组

values[0] : '1'
values[1] : 'Some Value'
values[2] : '31337'
values[3] : 'Another Value'
values[4] : ''
values[5] : ''
values[6] : ''
values[7] : ''
Run Code Online (Sandbox Code Playgroud)

整齐!

注意:Oracle的Java String.split(分隔符)与Android文档具有相同的功能,因为它们的解释更为简洁.(:

编辑:当@Supericy添加时,toSplit.split( ",", -1 )也会正确返回尾随的空条目.谢谢你的加入!

  • 或者,如果您事先不知道条目数,则可以使用`String.split(delimiter,-1)`.此外,javadoc*会告诉你它正在调用`String.split(del,limit)`,其限制为零; 所以你在android文档背后更好的原因是没有实际意义的. (2认同)