gpt4 book ai didi

java - 读取 csv 文件时无法移动到下一行

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:11 25 4
gpt4 key购买 nike

我有一个类可以帮助我读取 csv 文件,另一个类可以为 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 MyFormat 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")(MyFormat)
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")
)
}
}
}

现在,在我执行所有操作的类中,有一个名为 insertData 的方法,它获取一系列 purchaseInfos 并使用此 seq 中的每个 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 并停止...为什么?我检查了一下,有 34 行,所以 csv 文件没有问题。

这是用 scala 编写的,但 java 也可以提供帮助:)

最佳答案

你有一系列的Stream.map。第一个 iterator.toSeq 只是 toStream

iteratorWithHeaders.toSeq map PurchaseInfo.apply map addInvoiceFlow

insertData 不会急切地计算 addInvoiceFlow 的调用,而只会计算 head 元素。

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 .

关于java - 读取 csv 文件时无法移动到下一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32438086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com