在保留一些结构的同时将.csv文件读入scala

时间:2013-09-24 23:06:25

标签: scala csv

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

3 个答案:

答案 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)

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))

答案 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))