在Scala中解析CSV文件

时间:2019-03-09 19:12:38

标签: scala csv

我正在尝试将具有日语字符的CSV文件加载到scala的数据框中。当我读取列值"セキュリティ対策ウェビナー開催中】受講登録でスグに役立つ「e-Book」を進呈!"时,该值仅应放在一列中,它将在"」"处断开字符串(将此视为新行)并创建两个记录。 我也将“ charset”属性设置为UTF-16,引用字符为“ \”“,它仍然显示比文件更多的记录。

val df = spark.read.option("sep", "\t").option("header", "true").option("charset","UTF-16").option("inferSchema", "true").csv("file.txt")

任何有关如何解决此问题的指针将非常有帮助。

2 个答案:

答案 0 :(得分:1)

以下代码应适用于UTF-16。我无法在Notepad ++中设置编码为UTF-16的csv文件,因此我已经使用UTF-8对其进行了测试。请确保已设置输入文件编码为UTF-16。

代码段:

val br = new BufferedReader(
    new InputStreamReader(
      new FileInputStream("C:/Users/../Desktop/csvFile.csv"), "UTF-16"));

  for(line <- br.readLine()){
    print(line)
  }

  br.close();

csv使用的文件内容:

【セキュリティ対策ウェビナー開催中】受講登録でスグに役立つ「e-Book」を進呈!,January, セキュリティ, 開催, 1000.00

更新:

如果要使用spark加载,则可以按以下方式加载csv文件。

spark.read
      .format("com.databricks.spark.csv")
      .option("charset", "UTF-16")
      .option("header", "false")
      .option("escape", "\\")
      .option("delimiter", ",")
      .option("inferSchema", "false")
      .load(fromPath)

上述代码的示例输入文件:

  "102","03","セキュリティ対策ウェビナー開催中】受講登録でスグに役立つ「e-Book」を進呈!","カグラアカガワヤツキヨク","セキュリティ","受講登録でス"

答案 1 :(得分:1)

日语字符串中似乎有换行符。您可以在读取文件时尝试使用multiLine选项吗?

var data = spark.read.format("csv")
 .option("header","true")
 .option("delimiter", "\n")
 .option("charset", "utf-16")
 .option("inferSchema", "true")
 .option("multiLine", true)
 .load(filePath)

注意:根据以下答案,当输入文件很大时,这种方法会引起一些问题。 How to handle multi line rows in spark?