我刚刚开始使用Scala,来自Python。
我想读一个'|'分隔文件并保留表的结构。假设我有一个包含这样的文件:
1|2|3|4
5|6|7|8
9|10|11|12
我想要一个能返回这样结构的函数:
List(List(1, 2, 3, 4), List(5, 6, 7, 8), List(9, 10, 11, 12))
到目前为止我的代码(由于类型不匹配而无效):
import scala.io.Source
def CSVReader(absPath:String, delimiter:String): List[List[Any]] = {
println("Now reading... " + absPath)
val MasterList = Source.fromFile(absPath).getLines().toList
return MasterList
}
var ALHCorpus = "//Users//grant//devel//Scala-codes//ALHCorpusList"
var delimiter = "|"
var CSVContents = CSVReader(ALHCorpus, delimiter)
答案 0 :(得分:6)
我只是使用CSV库来做这种事情。当我不得不做类似的事情时,我使用了scala-csv。
如果你不想这样做,你不能简单地用你的分隔符拆分吗?即,
import scala.io.Source
def CSVReader(absPath:String, delimiter:String): List[List[Any]] = {
println("Now reading... " + absPath)
val MasterList = Source.fromFile(absPath).getLines().toList map {
// String#split() takes a regex, thus escaping.
_.split("""\""" + delimiter).toList
}
return MasterList
}
var ALHCorpus = "//Users//grant//devel//Scala-codes//ALHCorpusList"
var delimiter = "|" // I changed your delimiter to pipe since that's what's in your sample data.
var CSVContents = CSVReader(ALHCorpus, delimiter)
答案 1 :(得分:2)
首先,我会尝试通过不指定返回类型来推断类型。获得正确的结果后,开始约束返回类型并相应地调整CSVContents
返回的内容。这将解决类型错误。
def CSVReader(absPath:String, delimiter:String) = { ...}
CSVContents
然后返回:
scala> CSVContents
res0: List[String] = List(1|2|3|4, 5|6|7|8, 9|10|11|12)
从res0
到List[List[Any]]
的一种方法是使用正则表达式来贪婪地提取数字。这个正则表达式只是Scala中的"\\d+".r
。
val digitRegex = "\\d+".r
var CSVContents = CSVReader(ALHCorpus, delimiter).map(x => digitRegex.findAllIn(x).toList)
现在CSVContents
变成了这个:
CSVContents: List[List[String]] = List(List(1, 2, 3, 4), List(5, 6, 7, 8), List(9, 10, 11, 12))
答案 2 :(得分:0)
假设一个元组的序列是可以接受的(并且查看你的评论这是你可能想要的),你可以使用product-collections来完成。 product-collections在内部使用opencsv。
scala> CsvParser[Int,Int,Int,Int].parseFile("x", delimiter="|")
res2: org.catch22.collections.immutable.CollSeq4[Int,Int,Int,Int] =
CollSeq((1,2,3,4),
(5,6,7,8),
(9,10,11,12))