我有csv文件,如:
我想只提取专栏"摘要"超出上述文件。
我写了代码:
Dim newText = text.Replace("UserName = Unnamed", "UserName = " & TextBox_NewUser.Text)
但是这给出了输出:
许多"数组()"来了。我只想要该列的值"摘要",中间没有空白数组。
答案 0 :(得分:2)
如果您只想要摘要部分而没有中间数组,而只需要一个平面序列,请使用flatMap
:
val summaries = file.flatMap(_.split(',')(3))
但是看一下CSV,你可能想要检索某种标识符,所以也许Tuple2[String, String]
会更好:
val idToSummary = file.map(line => {
val lines = line.split(',')
(lines(2), lines(3))
})
答案 1 :(得分:1)
我建议使用专用的CSV库,因为CSV格式有许多令人惊讶的边缘情况,简单的“逐行读取,拆分”不会处理。
有各种高质量的CSV库 - scala-csv,purecsv,jackson-csv ......我将推荐kantan.csv,因为我是作者,觉得这是一个不错的选择,但我欣然承认有偏见。
无论如何,假设你的类路径中有kantan.csv库,这里是如何做到的(假设content
是java.io.File
):
import kantan.csv.ops._
content.asUnsafeCsvReader[List[String]](',', true).collect {
case _ :: _ :: s :: _ => s
}
这会将您的文件转换为CSV行上的迭代器,其中每一行都表示为List[String]
,然后将每行映射到其第三列的值(不包含三列或更多列的行)被忽略了。)
答案 2 :(得分:0)
试
val tmp1 = read_file2.map(_.split(",")).map( p=>p(3)).take(100).foreach(println)
对第一个字段使用p(0),对第四个字段使用p(3)等。
答案 3 :(得分:0)
如果文件不大,可以将其加载到内存中:
val tmp1 = file.map { line => line.split(',')(3) }
或者更简洁一点:
val tmp1 = file.map(_.split(',')(3))
答案 4 :(得分:0)
您可以使用:
val read_file2 = sc.textFile("path")
read_file2.map(_.split(",")(3)).collect
如果要根据列名获取列值,可以使用spark-csv databricks库
val df=sqlContext.read.format("csv").option("header","true").load("pathToCSv")
df.select("columnName").collect() // here Summary