如何确保下面的o_data追加多个文件?假设每个日期(从2018-09-01开始)有一个文件(制表符分隔值),我想附加所有30个文件(9/1〜9/30)并将其存储在o_data变量中。我最初的猜测是使用for循环,但对scala不熟悉,不确定从哪里开始。
以下内容适用于一个文件。
val o_data = "test::repo/shared/[2018-09-01]"
然后我用
val data = tes.read(o_data)
读取文件,但是为了让我获得一个月的数据,我唯一能做的就是为每个文件创建不同的val,因此o_data2,o_data3 ... o_data30并运行读取每个文件的功能并在最后将其合并,但这听起来很愚蠢...
答案 0 :(得分:1)
您可以执行以下操作:
val o_data = (1 to 30).map(d => {
val df = if(d<10) "0"+d else d
s"test::repo/shared/[2018-09-$df]"
})
完成上述操作后,o_data
将为:
test::repo/shared/[2018-09-01]
test::repo/shared/[2018-09-02]
test::repo/shared/[2018-09-03]
test::repo/shared/[2018-09-04]
test::repo/shared/[2018-09-05]
...
test::repo/shared/[2018-09-28]
test::repo/shared/[2018-09-29]
test::repo/shared/[2018-09-30]
这个想法是使用Scala的string interpolation从数字构造正确的文件名。 if
语句可确保数字前的0
小于10。
编辑:如果您喜欢一艘班轮,就像上面一样,可以将上面的内容重新写成(再次使用功能字符串串的报价,并感谢@Dima的建议):
val o_data=val files = (1 to 30)map(d =>f"test::repo/shared/[2018-09-$d%02d]")
编辑2:,因为这些是文件名,所以我们可以使用文件API来读取它们:
val allLines:mutable.Buffer[String] = mutable.Buffer()
o_data.foreach(filename => {
val lines = tes.read(filename)
allLines.append(line)
... //do stuff with lines read from file: "filename"
}
allLines foreach println
当然,您应该注意读取一堆文件(文件不存在等)可能引起的任何错误。 foreach
循环读取o_data中存在的文件名,并将对其进行逐一处理。您可以看到here来查看有关如何打开和读取文件的一些示例。
编辑3:也可以使用更具功能性的样式来聚合文件中的所有行:
import scala.io.Source.fromFile
val allLines = files.foldLeft(Iterator[String]())((f, g) => f ++ fromFile(g).getLines)
allLines foreach println
此方法的优点是它可以串联迭代器,如果文件很大,这可能会有所帮助。如果需要获取字符串,可以执行以下操作:
import scala.io.Source.fromFile
val allLines = files.foldLeft(List[String]())((f, g) => f ++ fromFile(g).getLines.toList)
allLines foreach println
此方法可以通过任何引起文件中行对齐的文件读取技术(OP的问题{data.read
)来实现。
答案 1 :(得分:1)
要获取任何月份的范围,请使用java.time库。检查一下
scala> val o_data = (1 to 31)
o_data: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31)
scala> val (year,month) = (2018,9)
year: Int = 2018
month: Int = 9
scala> o_data.map( x => { val y=java.time.LocalDate.of(year,month,1); y.plusDays(x-1)} ).filter( _.getMonthValue==month).map(s"test::repo/shared/["+_.toString+"]").foreach(println)
test::repo/shared/[2018-09-01]
test::repo/shared/[2018-09-02]
test::repo/shared/[2018-09-03]
test::repo/shared/[2018-09-04]
test::repo/shared/[2018-09-05]
test::repo/shared/[2018-09-06]
.........
test::repo/shared/[2018-09-30]
scala>