遍历scala中的日期范围

时间:2018-10-22 23:56:24

标签: scala

如何确保下面的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并运行读取每个文件的功能并在最后将其合并,但这听起来很愚蠢...

2 个答案:

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