8

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

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

String toSplit = "1,Some Value,31337,Another Value,";
String[] values = toSplit.split( "," );

values数组最终少于预期的数组条目数。创建的数组是:

values[0] : '1'
values[1] : 'Some Value'
values[2] : '31337'
values[3] : 'Another Value'

values[4]抛出 ArrayIndexOutOfBounds 异常。

我想要的数组是:

values[0] : '1'
values[1] : 'Some Value'
values[2] : '31337'
values[3] : 'Another Value'
values[4] : ''

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

这是 String.split() 中的错误吗?是否有解决方法/另一种选择?

4

1 回答 1

15

在我输入问题时想通了!使用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] : ''

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

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

String toSplit = "1,Some Value,31337,Another Value,"

调用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] : ''

整洁的!

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

编辑:正如@Supericy 添加的toSplit.split( ",", -1 )那样,也将正确返回尾随的空条目。感谢您的补充!

于 2013-05-25T23:59:44.937 回答