Обработайте два очень больших файла CSV. Загружайте их одновременно. Заменить какой-либо столбец в некоторых файлах столбцами в другом файле - PullRequest
0 голосов
/ 05 мая 2020

Требуется заменить некоторые столбцы в одном CSV-файле значениями столбцов в других CSV-файлах, которые не помещаются в памяти вместе. Языковые ограничения JAVA, SCALA. Нет ограничений Framwework.

Один из файлов имеет тип сопоставления ключ-значение, а другой файл имеет большое количество столбцов. И мы должны заменить значения в большом CSV-файле значениями в файле, который имеет сопоставление "ключ-значение".

1 Ответ

2 голосов
/ 05 мая 2020

В предположении, что вы можете взять в память все сопоставления значений ключа и затем обработать большое в потоковом режиме.

import java.io.{File, PrintWriter}
import scala.io.Source

val kv_file = scala.io.Source.fromFile("key_values.csv")

// Construct a simple key value map
val kv : Map[String,String] = kv_file.getLines().map { line =>
  val cols = line.split(";")
  cols(0) -> cols(1)
}.toMap


val writer = new PrintWriter(new File("processed_big_file.csv" ))

big_file.getLines().foreach( line => {
  // this is the key-value replace logic (as I understood)
  val processed_cols = line.split(";").map { s => kv.getOrElse(s,s) }

  val out_line = processed_cols.mkString(";");
  writer.write(out_line)
})
// close file
writer.close()

В предположении, что вы не можете полностью загрузить сопоставление значений ключа тогда вы можете частично загрузить в память файл с картами "ключ-значение", а затем по-прежнему обрабатывать большой файл. Конечно, вам нужно много раз перебирать файлы, чтобы получить обработанные все ключи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...