2

我刚开始使用 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)
4

3 回答 3

6

对于这类事情,我只会使用 CSV 库。当我不得不做类似的事情时,我使用了scala-csv

如果你不想这样做,你不能简单地用你的分隔符分割吗?IE,

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)
于 2013-09-25T00:40:20.840 回答
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)

一种方法res0List[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))
于 2013-09-24T23:24:44.997 回答
0

假设 Seq 的元组是可以接受的(并且查看您的评论,这可能是您想要的),您可以使用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))
于 2013-09-26T13:01:12.870 回答