0

一部の Excel ファイルを処理するために Scala 2.9 を使用しています。それらはすべてディレクトリに保存され、ファイル名はSales_yyyy_mm.xlsx.

年、月、およびFile各 Excelの配列を生成するために、次のコードを作成しました。

val fileStruct = """Sales_(\d\d\d\d)_(\d\d).xlsx""".r

val excels = (new java.io.File(dirName)).listFiles

val files = for(file <- excels; fileStruct(year, month) <- file.getName)
            yield(file, year, month)

ファイルの配列は に正しく計算されexcelsます。ただしfiles空です。ファイル名を確認しましたが、すべて正規表現と一致しています ( match/を使用してコードを書き直してcaseも問題ありません)。

コードは正しくコンパイルされ、期待どおりに型が推測されますが、機能しません。私は何を間違っていますか?

4

3 に答える 3

4

問題は、それが -- をfile.GetName返すこと、Stringまたは for-comprehension の観点からは. を返すことSeq[Char]です。ここで、for 内包表記でパターン マッチングを使用すると、マッピングまたは flatMapping の前にフィルターを適用することになります。実際には、これを行っています:

  val files = excels.flatMap(
    (file => file.getName().withFilter(
      ((x$0 => x$0 match {
        case fileStruct((year @ _), (month @ _)) => true
        case _ => false
      })).map(
        (x$1 => x$1 match {
         case fileStruct((year @ _), (month @ _)) => (file, year, month)
      }))))

問題は、それx$0が であるCharため、正規表現パターンと一致しないことです。

于 2013-02-08T23:15:11.443 に答える
2

私はそれを次のように動作させました:

val fileStruct = """Sales_(\d\d\d\d)_(\d\d).xlsx""".r

val excels = (new java.io.File(dirName)).listFiles

val files = for{
                file <- excels
                year :: month :: _ <- fileStruct.unapplySeq(file.getName)
            }
            yield(file, year, month)
于 2013-02-09T07:49:48.097 に答える
1

ディレクトリに Sales_yyyy_mm_xlsx しかない場合は、これを試してください。

scala> val files = for(file <- excels ; val fileStruct(year, month) = file.getName)
     | yield(file, year, month);

そうでない場合:

excels.map(file => fileStruct.findFirstIn(file.getName) match {
     |  case Some(fileStruct(year, month)) => Some(file, year, month)
     |  case _ => None
     | }).filterNot(_.isEmpty)

ください :

res3: Array[Option[(java.io.File, String, String)]] = Array(Some((./Sales_2012_03.xlsx,2012,03)), Some((./Sales_2012_04.xlsx,2012,04)))

正規表現が一致しない場合に問題が発生すると思います

于 2013-02-08T23:05:54.257 に答える