String Scala如何从CSV中的特定列中查找所有唯一值?

String Scala如何从CSV中的特定列中查找所有唯一值?,string,scala,csv,getline,String,Scala,Csv,Getline,我正在使用Scala读取csv文件。该文件的格式为3列,每列用\t字符分隔。前两列不重要,第三列包含以字符串形式存储的逗号分隔标识符列表。以下是输入csv的示例: 0002ba73 US 6o7,6on,6qc,6qj,6nw,6ov,6oj,6oi,15me,6pb,6p9 002f50e4 US 6om,6pb,6p8,15m9,6ok,6ov,6qc,6oo,15me 004b5edc US 6oj,6nz,6on,6om,6qc,6ql,6p6,15me 005c

我正在使用Scala读取csv文件。该文件的格式为3列,每列用\t字符分隔。前两列不重要,第三列包含以字符串形式存储的逗号分隔标识符列表。以下是输入csv的示例:

0002ba73    US  6o7,6on,6qc,6qj,6nw,6ov,6oj,6oi,15me,6pb,6p9
002f50e4    US  6om,6pb,6p8,15m9,6ok,6ov,6qc,6oo,15me
004b5edc    US  6oj,6nz,6on,6om,6qc,6ql,6p6,15me
005cc990    US  6pb,6qf,15me,6og,6nx,6qc,6om,6ok
005fe1ea    US  15me,6p0,6ql,6ok,6ox,6ol,6o5,6qj
00777555    US  6pb,15me,6nw,6rk,6qc,6ov,6qj,6o0,6oj,6ok,6on,6p6,6nx,15m9
00cbcc7d    US  6oj,6qc,6qg,6pb,6ol,6p6,6ov,15me
010254a6    US  6qc,6pb,6nw,6nx,15me,6o0,6ok,6p8
011b905c    US  6oj,6nw,6ov,15me,6qc,6ow,6ql,6on,6qi,6qe
011fffa6    US  15me,6ok,6oj,6p6,6pb,6on,6qc,6ov,6oo,6nw,6oc
我想读入csv,去掉前两列,创建一个列表,其中包含第三列中找到的每个唯一标识符代码的一个实例,因此对上述数据运行代码应该返回结果列表6on、6qc、6qj、6nw、6ov、6oj、6oi、15me、6pb、6p9、6p8、15m9、6ok、6oo、6nz、6om、6ql、6p6、6qf、6og、6nx、6p0、6ox,6ol,6o5,6rk,6o0,6qg,6ow,6qi,6qe,6oc

我有以下代码,它返回一个列表,其中包含csv文件中任何位置的每个不同值:

val in_file = new File("input_file.csv")
val source = scala.io.Source.fromFile(in_file, "utf-8")
val labels = try source.getLines.mkString("\t") finally source.close()
val labelsList: List[String] = labels.split("[,\t]").map(_.trim).toList.distinct
使用上述输入,我的代码返回标签列表,其值为List0002ba73-e60c-4ffb-9131-c1612b904658、US、6o7、6on、6qc、6qj、6nw、6ov、6oj、6oi、15me、6pb、6p9、002f50e4-48cc-4b14-bb80-0506868B6161、6om、6p8、15m9、6ok、6oo、004b5edc-c0cc-4ffd-bef3-9803-BD92B92E6、NZ、6ql、6ql、6F802F50E4-6F806、6B836F8F6F6F6F8F6F6F6、6F8F8F6、6F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8,005fe1ea-b918-48a3-a495-1f8ac12935ba,6p0,6ox,6ol,6o5,00777555-83d4-401e-861b-5892f3aa3e1c,6rk,6o0,00cbcc7d-1b48-4c5c-8141-8fc8f62b7b07,6qg,010254a6-2ef0-4a24-aa4d-3cc6656a55de,011b905c-fbf3-441a-8912-A94FE8A1D,CC0O8D,QE6FFA-8B7B7B7B7B7B7B7B7B7B7B7G,010254a6-2F0-4F-6F-CED8F-8F-8F,CED8F-866F-866F-8F


如何使代码正常运行并忽略csv前两列中包含的任何内容?

您可以忽略前两列,然后用逗号分隔第三列。 最后,toSet将消除重复的标识符

val f = Source.fromFile("input_file.csv")
val lastColumns = f.getLines().map(_.split("\t")(2))
val uniques = lastColumns.flatMap(_.split(",")).toSet
uniques foreach println

可以忽略前两列,然后用逗号分隔第三列。 最后,toSet将消除重复的标识符

val f = Source.fromFile("input_file.csv")
val lastColumns = f.getLines().map(_.split("\t")(2))
val uniques = lastColumns.flatMap(_.split(",")).toSet
uniques foreach println

这是你能做的,我正在做一个样本DF,你可以用你的替换

val Df = Seq(("7369", "SMITH" , "2010-12-17", "800.00"), ("7499", "ALLEN","2011-02-20", "1600.00")).toDF("empno", "ename","hire_date", "sal")

val reqCols = Seq(2)
val finalDf = Df.select(reqCols map Df.columns map col: _*)
finalDf.show
注意:这是基于0的索引,所以传递2得到第三列

如果要从所需列中获取不同的值,可以将distinct与mkstring一起使用

日期重复,上面的代码正在删除重复的日期


这是你能做的,我正在做一个样本DF,你可以用你的替换

val Df = Seq(("7369", "SMITH" , "2010-12-17", "800.00"), ("7499", "ALLEN","2011-02-20", "1600.00")).toDF("empno", "ename","hire_date", "sal")

val reqCols = Seq(2)
val finalDf = Df.select(reqCols map Df.columns map col: _*)
finalDf.show
注意:这是基于0的索引,所以传递2得到第三列

如果要从所需列中获取不同的值,可以将distinct与mkstring一起使用

日期重复,上面的代码正在删除重复的日期


使用Scala 2.13资源管理

util.Using(io.Source.fromFile("input_file.csv")){
  _.getLines()
   .foldLeft(Array.empty[String]){
     _ ++ _.split("\t")(2).split(",")
   }.distinct.toList
}
//res0: scala.util.Try[List[String]] =
// Success(List(6o7, 6on, 6qc, 6qj, 6nw, 6ov, 6oj, 6oi, 15me, 6pb, 6p9, 6om, 6p8, 15m9, 6ok, 6oo, 6nz, 6ql, 6p6, 6qf, 6og, 6nx, 6p0, 6ox, 6ol, 6o5, 6rk, 6o0, 6qg, 6ow, 6qi, 6qe, 6oc))

如果数组结果可接受,则可以删除.toList。

使用Scala 2.13资源管理

util.Using(io.Source.fromFile("input_file.csv")){
  _.getLines()
   .foldLeft(Array.empty[String]){
     _ ++ _.split("\t")(2).split(",")
   }.distinct.toList
}
//res0: scala.util.Try[List[String]] =
// Success(List(6o7, 6on, 6qc, 6qj, 6nw, 6ov, 6oj, 6oi, 15me, 6pb, 6p9, 6om, 6p8, 15m9, 6ok, 6oo, 6nz, 6ql, 6p6, 6qf, 6og, 6nx, 6p0, 6ox, 6ol, 6o5, 6rk, 6o0, 6qg, 6ow, 6qi, 6qe, 6oc))

如果数组结果可接受,则可以删除.toList。

使用regex的另一种方法

val data = scala.io.Source.fromFile("source.txt").getLines()
data.toList.flatMap {
  line => """\S+\s+\S+\s+(\S+)""".r.findAllMatchIn(line).map( x => x.group(1).split(",").toList)
  }.flatten.distinct

// res0: List[String] = List(6o7, 6on, 6qc, 6qj, 6nw, 6ov, 6oj, 6oi, 15me, 6pb, 6p9, 6om, 6p8, 15m9, 6ok, 6oo, 6nz, 6ql, 6p6, 6qf, 6og, 6nx, 6p0, 6ox, 6ol, 6o5, 6rk, 6o0, 6qg, 6ow, 6qi, 6qe, 6oc)

使用regex的另一种方法

val data = scala.io.Source.fromFile("source.txt").getLines()
data.toList.flatMap {
  line => """\S+\s+\S+\s+(\S+)""".r.findAllMatchIn(line).map( x => x.group(1).split(",").toList)
  }.flatten.distinct

// res0: List[String] = List(6o7, 6on, 6qc, 6qj, 6nw, 6ov, 6oj, 6oi, 15me, 6pb, 6p9, 6om, 6p8, 15m9, 6ok, 6oo, 6nz, 6ql, 6p6, 6qf, 6og, 6nx, 6p0, 6ox, 6ol, 6o5, 6rk, 6o0, 6qg, 6ow, 6qi, 6qe, 6oc)

该代码为每行的第三列内容创建一个单独的集合。这里的目标是创建一个集合,其中包含任何行的第三列中出现的每个唯一标识符。该代码为每行的第三列内容创建一个单独的集合。这里的目标是创建一个集合,其中包含任何行的第三列中出现的每个唯一标识符。此问题不使用spark。此问题不使用spark。