2013-05-21 1 views
2

Я попытался простой раскол для Csv стиле строки, которая содержит пробелы после запятых, как это:Scala струноподобные сплит метод создает дополнительные двойные кавычки для ведущих пространств

scala> """"First", "SecondAfterSpace"""".split(",") 
res0: Array[String] = Array("First", " "SecondAfterSpace"") 

scala> res0(0) 
res3: String = "First" 

scala> res0(1) 
res4: String = " "SecondAfterSpace"" 

Вторая строка результата массив имеет неожиданную двойные кавычки, больше, чем исходная строка.

Это нормально, что содержит дополнительное пространство в начале, поскольку я еще не обрезал его. Но я бы ожидать такой же результат, как показано ниже с дополнительным ведущим пространством, вместо дополнительных двойных кавычек:

scala> """"First","SecondNoSpace"""".split(",") 
res1: Array[String] = Array("First", "SecondNoSpace") 

Я знаю, что могу обойти эту проблему со следующим, но я хотел бы понять, если Я делаю что-то неправильно, или если это ошибка:

scala> """"First", "SecondAfterSpaceTrimmed"""".split(",").map(_.trim) 
res2: Array[String] = Array("First", "SecondAfterSpaceTrimmed") 

Просто чтобы убедиться, что я перепробовал все варианты, как

.split(',') 
.split(""",""") 
.split("""\,""") 
.split(Array(',')) 

, но все с тем же результатом дополнительных двойных кавычек.

В этом контексте: из scala-doc я вижу, что используется метод в StringLike. В документации говорится о массиве символов. Тем не менее я могу использовать регулярное выражение, которое не задокументировано, поэтому он сделал меня подозрительным, если он использует метод split в Java String ... Я запутался ...

ответ

6

Нет, это не так. Это путь РЕПЛ представляет его:

scala> val xs = """"First", "SecondAfterSpace"""".split(",") 
xs: Array[String] = Array("First", " "SecondAfterSpace"") 

scala> xs.last 
res0: String = " "SecondAfterSpace"" 

scala> xs.last.count(_ == '"') 
res1: Int = 2 

Как вы можете видеть, не существует никаких дополнительных цитат

обрезать пробелы после цитаты вы можете использовать регулярное выражение в расколе:

scala> val xs = """"First", "SecondAfterSpace"""".split(",[ ]?") 
xs: Array[String] = Array("First", "SecondAfterSpace") 
+0

Более общее регулярное выражение для раскола было бы: '" "", \ p {Пробел} * "" "" – nadavwr

+0

Спасибо за быстрый ответ и регулярное выражение, игнорируя пространство. Таким образом, scala split, похоже, принимает регулярное выражение, несмотря на scala doc, который говорит о разделителях (chars) - нет упоминания о регулярном выражении. – fredfred

+0

@fredfred [строки Scala - строки Java] (http://www.scala-lang.org/api/current/index.html#scala.Predef$ @String=String) и [строки Java имеют метод split, который принимает значение regexp ] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split (java.lang.String)). StringLike сутенеры Java-строка с разделенными методами, которая принимает разделители (-ы) как один символ или массив символов –