如何使用csv文件阅读器(Scala)支持UTF-8-BOM文件

时间:2017-01-10 13:08:00

标签: java scala csv utf-8

我有一个简单的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)
    }
    }
  }

1 个答案:

答案 0 :(得分:0)

来自SO answer

对UTF-8

既不要求也不建议使用BOM

根据Unicode standard,不建议使用不包括UTF-8文件的BOM

UTF-8 BOM是一个字节序列(EF BB BF),允许读者将文件识别为以UTF-8编码。通常,BOM用于表示编码的字节顺序,但由于字节顺序与UTF-8无关,因此BOM不是必需的。