我有一个简单的csv阅读器,用于上传csv,对数据进行一些操作并打印新的csv输出。
我正在使用带有Scala的tototoshi csv库。
我的问题是我的项目知道处理UTF-8文件,但现在我需要支持UTF-8-BOM文件,如果有人可以解释我如何解决这个问题,那将会很有帮助。
这是支持UTF-8的当前功能:
作家:
//----------------WRITER----------------//
class CsvDataWriter(csvFile: File, headers: List[String])(implicit format: CSVFormat) {
val fos = new FileOutputStream(csvFile, false)
private val writer = {
CSVWriter.open(fos, "UTF-8")(format)
}
writer.writeRow(headers)
def close() = {
fos.close()
writer.close()
}
def write(outputCSVRow: RowMap) = writer.writeRow(headers map outputCSVRow)
def writeHeaders(headers: List[String]) = {
writer.writeRow(headers)
}
}
阅读器:
//----------------READER----------------//
class CsvDataReader(csvFile: File) {
private val reader = CSVReader.open(csvFile, "UTF-8")(Format)
val headers: List[String] = reader.readNext().get
def close() = reader.close()
def iteratorWithHeaders: Iterator[Map[String, String]] = {
reader.iterator.map(line => headers.zip(line).toMap)
}
}
这是用户选择文件时的上传功能:
def upload = Action(parse.multipartFormData) { implicit request =>
request.body.file("file").fold {
BadRequest("Missing file")
} { uploadedFile => {
val localFile = new File("/tmp/" + uploadedFile.ref.file.getName)
Files.copy(uploadedFile.ref.file.toPath, localFile.toPath, StandardCopyOption.REPLACE_EXISTING)
localFile.deleteOnExit()
val j = Json.parse( s"""{"fileId": "${Crypto.encryptAES(localFile.getAbsolutePath)}"}""")
Ok(j)
}
}
}
答案 0 :(得分:0)
对UTF-8
既不要求也不建议使用BOM根据Unicode standard,不建议使用不包括UTF-8文件的BOM :
UTF-8 BOM是一个字节序列(EF BB BF),允许读者将文件识别为以UTF-8编码。通常,BOM用于表示编码的字节顺序,但由于字节顺序与UTF-8无关,因此BOM不是必需的。