将每个arraylist / list元素拆分为整数和字符串元组

时间:2017-12-11 07:08:51

标签: regex scala split tuples

我将sql insert语句解析为值列表,如下所示:

List(6606 'TIMI YURO' 'HURT' 0)
List(6607 'TIMI YURO' 'WHAT*S A MATTER BABY' 0)
List(6608 'TIMI YURO' 'MAKE THE WORLD GO AWAY' 0)
List(6609 'HELMUT ZACHARIAS' 'WHEN THE WHITE LILACS BLOOM AGAIN' 0)
List(6610 'JOHN *THE COOL GHOUL* ZACHERLE' 'DINNER WITH DRAC' 0)
List(6611 'MICHAEL ZAGER BAND' 'LET*S ALL CHANT' 0)
List(6612 'ZAGER AND EVANS' 'IN THE YEAR 2525 (EXORDIUM AND TERMINUS)' 1)
List(6613 'RICKY ZAHND / BLUEJEANERS' 'NUTTIN* FOR CHRISTMAS' 0)
List(6614 'WARREN ZEVON' 'WEREWOLVES OF LONDON' 0)
List(6615 'ZOMBIES' 'SHE*S NOT THERE' 0)

现在,对于每个列表,我想将整数和字符串分成4的元组。我不擅长正则表达式。如果我执行split(" "),那么在某些情况下,我有一个带有空格的复杂字符串,例如WHEN THE WHITE LILACS BLOOM AGAIN,我希望将其保存为单个字符串元组值,它不起作用。我试过了.map( recordID => ( recordID(0), recordID(1), recordID(2), recordID(3) ) ),但我会超出约束范围。如果有人能提供帮助,我将不胜感激。

更新: 以下是原始的sql语句。这很长,但我只是发布一个样本。我想从文件中读取每个值到4的元组(int,string,string,int):

insert into songlist (id, artist, title, numone) values (6606, 'TIMI YURO', 'HURT', 0);
insert into songlist (id, artist, title, numone) values (6607, 'TIMI YURO', 'WHAT*S A MATTER BABY', 0);
insert into songlist (id, artist, title, numone) values (6608, 'TIMI YURO', 'MAKE THE WORLD GO AWAY', 0);
insert into songlist (id, artist, title, numone) values (6609, 'HELMUT ZACHARIAS', 'WHEN THE WHITE LILACS BLOOM AGAIN', 0);
insert into songlist (id, artist, title, numone) values (6610, 'JOHN *THE COOL GHOUL* ZACHERLE', 'DINNER WITH DRAC', 0);
insert into songlist (id, artist, title, numone) values (6611, 'MICHAEL ZAGER BAND', 'LET*S ALL CHANT', 0);
insert into songlist (id, artist, title, numone) values (6612, 'ZAGER AND EVANS', 'IN THE YEAR 2525 (EXORDIUM AND TERMINUS)', 1);
insert into songlist (id, artist, title, numone) values (6613, 'RICKY ZAHND / BLUEJEANERS', 'NUTTIN* FOR CHRISTMAS', 0);
insert into songlist (id, artist, title, numone) values (6614, 'WARREN ZEVON', 'WEREWOLVES OF LONDON', 0);
insert into songlist (id, artist, title, numone) values (6615, 'ZOMBIES', 'SHE*S NOT THERE', 0);

1 个答案:

答案 0 :(得分:1)

您可以遍历输入行并执行类似这样的操作

val line = "insert into songlist (id, artist, title, numone) values (6606, 'TIMI YURO', 'HURT', 0);"
val parseInsertRegex = raw".*values \((\d+), '(.*)', '(.*)', (\d+)\);".r
line match {
    case parseInsertRegex(id, artist, title, numone) => (id.toInt, artist, title, numone == "1")
}

这会让我回头

res0: (Int, String, String, Boolean) = (6606,TIMI YURO,HURT,false)