使用 Scala 从 FilePath 中提取文件夹名称和文件名
Extract folder name and filename from FilePath using scala
我有从目录中读取的文件流,文件树的格式为:
/repository/resources/2016-03-04/file.csv
/repository/resources/2016-03-04/file2.csv
/repository/resources/2016-03-05/file3.csv
/repository/resources/2016-03-05/file4.csv
拜托,我需要帮助使用 scala 提取日期文件夹的名称和格式为 .csv 的文件:
2016-03-03 file.csv
2016-03-04 file2.csv
2016-03-05 file3.csv
2016-03-05 file4.csv
您可以尝试此解决方案,但我建议您使用正则表达式来提取文件夹名称。这将为您的代码添加验证功能。
val fileName : String = "/repository/resources/2016-03-05/file4.csv"
val result = fileName.split("/")
println( result(3) )
正则表达式解决方案如下所示:
val fileName : String = "/repository/resources/2016-03-05/file5.csv"
val Pattern = "/([a-z]+)/([a-z]+)/([-0-9]+)/([a-z0-9.]+)".r
val Pattern(partA, partB, partC, partD) = fileName
println( partA )
println( partB )
println( partC )
println( partD )
作为@PavelOliynyk 建议的补充,您可以执行以下操作:
val list = List(
"/repository/resources/2016-03-04/file.csv",
"/repository/resources/2016-03-04/file2.csv",
"/repository/resources/2016-03-05/file3.csv",
"/repository/resources/2016-03-05/file4.csv")
val datesAndFiles = list.map(_.split("/").takeRight(2).toList)
这是假设每个字符串中的最后两项是日期和文件名。我将它转换为列表,以便在需要进一步处理时可以轻松地进行模式匹配,例如这就是你如何为每一行获得一个元组:
val datesAndFileTuples = datesAndFiles.map({
case date :: file :: Nil => (date, file)
})
这会为每个日期文件对提供一个元组。如果您更愿意将它们分成日期和文件(每个都在自己的列表中),您可以这样做:
val (dates :: files :: Nil) = datesAndFiles.transpose
返回两个列表,一个是日期,一个是文件名。
我有从目录中读取的文件流,文件树的格式为:
/repository/resources/2016-03-04/file.csv
/repository/resources/2016-03-04/file2.csv
/repository/resources/2016-03-05/file3.csv
/repository/resources/2016-03-05/file4.csv
拜托,我需要帮助使用 scala 提取日期文件夹的名称和格式为 .csv 的文件:
2016-03-03 file.csv
2016-03-04 file2.csv
2016-03-05 file3.csv
2016-03-05 file4.csv
您可以尝试此解决方案,但我建议您使用正则表达式来提取文件夹名称。这将为您的代码添加验证功能。
val fileName : String = "/repository/resources/2016-03-05/file4.csv"
val result = fileName.split("/")
println( result(3) )
正则表达式解决方案如下所示:
val fileName : String = "/repository/resources/2016-03-05/file5.csv"
val Pattern = "/([a-z]+)/([a-z]+)/([-0-9]+)/([a-z0-9.]+)".r
val Pattern(partA, partB, partC, partD) = fileName
println( partA )
println( partB )
println( partC )
println( partD )
作为@PavelOliynyk 建议的补充,您可以执行以下操作:
val list = List(
"/repository/resources/2016-03-04/file.csv",
"/repository/resources/2016-03-04/file2.csv",
"/repository/resources/2016-03-05/file3.csv",
"/repository/resources/2016-03-05/file4.csv")
val datesAndFiles = list.map(_.split("/").takeRight(2).toList)
这是假设每个字符串中的最后两项是日期和文件名。我将它转换为列表,以便在需要进一步处理时可以轻松地进行模式匹配,例如这就是你如何为每一行获得一个元组:
val datesAndFileTuples = datesAndFiles.map({
case date :: file :: Nil => (date, file)
})
这会为每个日期文件对提供一个元组。如果您更愿意将它们分成日期和文件(每个都在自己的列表中),您可以这样做:
val (dates :: files :: Nil) = datesAndFiles.transpose
返回两个列表,一个是日期,一个是文件名。