2016-06-27 33 views
-1

我不明白爲什麼我的輸出文件正在失去其順序。使用csv閱讀器庫無法保持csv列順序(tototoshi)

我正在上傳帶有標題的csv文件(key1 | key2 | key3)。然後,我使用CsvDataReader來遍歷頭文件(scala.Iterator[Map[String, String]])。我映射此迭代器,因爲我想爲csv文件添加值,我爲輸出創建一個新文件,但輸出的順序與原始文件不同...首先,它是:

key1 key2 key3和映射後,我希望看到key1 key2 key3 key4

但結果卻是相反:

key3 key1 key4 key2

這是爲什麼?

這是我的代碼:

val csvFile = new File(Crypto.decryptAES(request.fileId)) 
    if (csvFile.exists()) { 

     val csvDataReader = new CsvDataReader(csvFile) 

     val resultLines = csvDataReader.iteratorWithHeaders.map(row => { 
     row ++ Map("key4" -> "val4", "key5" -> "val5") 

     }).toList 

     val headerOfFile = resultLines.head.keys.toList 

     val outputFile = File.createTempFile("output-", ".csv") 

     val csvDataWriter = new CsvDataWriter(outputFile,true) 
     csvDataWriter.writeHeaders(headerOfFile) 

     resultLines foreach {csvDataWriter.write(_,headerOfFile)} 
     csvDataReader.close() 
     csvDataWriter.close() 
+0

知道你的課程來自哪裏會很酷......如果它們包含可能相關的錯誤,你不這麼認爲嗎? – Dici

+0

@Dici哪個類?我分享了一段包含bug的代碼,並且所有的東西都直接轉發到csv閱讀器庫文件夾 – Joe

回答

0

默認地圖Scala中使用Map時返回的scala.collection.immutable.HashMap,這是無序的。 row ++ Map(...)也返回scala.collection.immutable.HashMap,因此它無序。

看看這個API,除了重複調用readNext之外別無選擇。

def appendList[T](list: List[T], toAppend: Seq[T]) = new ListBuffer[T]() ++= list ++= toAppend 

val csvFile = new File(Crypto.decryptAES(request.fileId)) 
if (csvFile.exists()) { 
    val csvDataReader = new CsvDataReader(csvFile) 

    val headers = csvDataReader.readNext().getOrElse(Nil) 
    val newHeaders = appendList(headers, List("key4", "key5")) 

    val outputFile = File.createTempFile("output-", ".csv") 

    val csvDataWriter = new CsvDataWriter(new BufferedWriter(new FileWriter(outputFile))) 

    csvDataReader.iterator.foreach {csvDataWriter.writeRow(appendList(_, List("value4", "value5"))} 

    csvDataReader.close() 
    csvDataWriter.close() 

這個答案是基於磁帶庫(https://github.com/tototoshi/scala-csv,提交715e726),這顯然不是你所使用的最新版本。

+0

如何使用LinkedHashMap實現它,假設它返回有序映射? resultLines返回'scala.List [Map [String,String]]' – Joe

+0

我正在查看代碼,沒有任何東西可以保證這個方法的順序。 – Dici

+0

@Joe更新了我的答案 – Dici