私は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はあまりにも:)
'insertData'の' purchaseInfos'引数がどのように構築されているかは表示されません。その順序で複数のエントリが存在しますか? – Tim