2015-09-07 18 views
11

私はcsvファイルの読み込みに役立つクラスと、csvの各行のオブジェクトを作成する別のクラスを持っているので、各行ごとにいくつかのアクションを別々に実行できます。これを自動化に使用します。私は間違っているものを知らない前に、それが働いていた私のプログラムが停止した1行の後に何らかの理由によりcsvファイルの読み込み中に次の行に移動する

... ..

これは私のCSVリーダークラスです:

import java.io.File 
import com.github.tototoshi.csv.CSVReader 
import jxl.{Cell, Workbook} 

import scala.collection.mutable 

trait DataSource { 

    def read (fileName: String): Seq[Map[String, String]] 
} 

object CsvDataSource extends DataSource { 
    import com.github.tototoshi.csv.CSVFormat 
    import com.github.tototoshi.csv.Quoting 
    import com.github.tototoshi.csv.QUOTE_MINIMAL 

    implicit object VATBoxFormat extends CSVFormat { 
    val delimiter: Char = '\t' 
    val quoteChar: Char = '"' 
    val escapeChar: Char = '"' 
    val lineTerminator: String = "\r\n" 
    val quoting: Quoting = QUOTE_MINIMAL 
    val treatEmptyLineAsNil: Boolean = false 
    } 

    override def read(file: String): Seq[Map[String, String]] = { 
    val reader = CSVReader.open(file, "UTF-16")(VATBoxFormat) 
    reader.iteratorWithHeaders.toSeq 
    } 
} 

これはPurchaseInfoですcsvファイルの各行のオブジェクトを作成しているクラス:

case class PurchaseInfo(
         something1: String, 
         something2: String, 
         something3: String, 
         something4: String) { 
} 


object PurchaseInfo { 

    private def changeDateFormat(dateInString: String): String = { 
    //System.out.println(dateInString) 
    val formatter: SimpleDateFormat = new SimpleDateFormat("MMM dd, yyyy") 
    val formatter2: SimpleDateFormat = new SimpleDateFormat("dd/MM/yyyy") 
    val date: Date = formatter.parse(dateInString) 
    return formatter2.format(date).toString 
    } 

    def fromDataSource (ds: DataSource)(fileName: String): Seq[PurchaseInfo] = { 

     ds.read(fileName).map { c => 
     PurchaseInfo(
      something1 = c("Supplier Address Street Number"), 
      something2 = c("Supplier Address Route"), 
      something3 = c("Supplier Address Locality"), 
      something4 = c("Supplier Address Postal Code") 
     ) 
     } 
    } 
} 

今、私はすべてのアクションを実行するクラスでpurcのシーケンスを取得insertDataと呼ばれるひとつの方法がありますhaseInfosと、この配列内の各purchaseInfoで別のメソッドを呼び出します....

def insertData (purchaseInfos: Seq[PurchaseInfo]) = { 

    //logging in and then getting directed to the right path (where we start the invoices automation) 
    login() 

    val res = purchaseInfos.map { case purchaseInfo => 
     println(purchaseInfo.invoiceNumber) 
     (purchaseInfo, Try(addInvoiceFlow(purchaseInfo))) 
    } 
    res 
    } 

問題はinsertDataが...なぜaddInvoiceFlow最初purchaseInfoで一つだけ呼び出して、停止しているのですか?これはScalaで書かれているが、行末がシーケンス\r\nであればJavaはあまりにも:)

+0

'insertData'の' purchaseInfos'引数がどのように構築されているかは表示されません。その順序で複数のエントリが存在しますか? – Tim

答えて

4

入力ファイルを読み終える前に何らかの理由で入力ファイルを閉じると思われます。 insertDataというコードを提供していないので、私は確信できません。この仮説をテストするには、それは後に動作する場合は、あなたを消費する前に、それはあなたがCSVReaderを閉じることを意味

reader.iteratorWithHeaders.toList 

reader.iteratorWithHeaders.toSeq 

を変更することにより、read方法でファイルの内容を具現しようデータ。


アップデート:私のオリジナルの答えに、私は私の説明では、右の修正に関する権利だったが、ありません。 @ som-snyttが答えで正しく指摘したように、Stream.mapはストリームを認識しません。ストリームが実際に実現されたときに追加要素変換を定義するだけです。そのため、いくつかのケースでは、すなわち

ds.read(fileName).map { c => PurchaseInfo(...)}.force 
、実現が直接あなたに PurchaseInfo Sを与えるとき、(これの周りに運ばれた中間 Mapの作成)読取点でストリームを実現するのではなく、マップの後にそれを行うには有用ではないかもしれ
0

チェックを助けることができる

..私がチェックし、csvファイルとはPROBがないので、34行があります。

\nでもかまいません。

は改行文字ですが、\rはキャリッジリターンです。 Windowsでは、dosを使用する後方互換性のために、カップル\r\nを使用します。

UNIXのみ\nです。

+0

私はちょうど\ n今使ってみましたが、それはそうではありません:/ –

+0

一般に、テキストファイルを読むためのJava IOクラスは行の終わりを気にしません。 –

6

あなたは一連のStream.mapを持っています。最初のiterator.toSeqはちょうどtoStreamです。

iteratorWithHeaders.toSeq map PurchaseInfo.apply map addInvoiceFlow 

insertDataは熱心にaddInvoiceFlowの呼び出しが、唯一頭の要素を評価しません。

scala> (1 to 10).toStream map { i => println(s"Hi, $i") ; i + 1} 
Hi, 1 
res0: scala.collection.immutable.Stream[Int] = Stream(2, ?) 

したがってinsertDataは、この部分的に評価されたストリームを返します。

あなたは評価を強制することができます。

scala> res0.force 
Hi, 2 
Hi, 3 
Hi, 4 
Hi, 5 
Hi, 6 
Hi, 7 
Hi, 8 
Hi, 9 
Hi, 10 
res1: scala.collection.immutable.Stream[Int] = Stream(2, 3, 4, 5, 6, 7, 8, 9, 10, 11) 

this issueは、あなたがパースエラーを持っている場合もあります。 this commentを参照してください。

関連する問題