web-dev-qa-db-ja.com

freadでcsvをインポートする際の「文字列に埋め込まれたヌル」エラー

data.table::freadを使用してインポートしようとしている大きなファイル(3.5G)があります。

もともとは、テキストとして開かれ、CSVとして保存されたrptファイルから作成されました。

これは、同じタイプのデータが同じ列ですべての小さなファイルでうまく機能しました。これは、より長い時間枠とより広い範囲のためだけです。

実行しようとすると

mydata <- fread("mycsv.csv")

エラーが表示されます:

Fread( "mycsv.csv")のエラー:文字列に埋め込まれたNUL: 'y\0e\0a\0r\0'

これは何を意味するのでしょうか?

27
datahappy

次のようなものを使用して、コマンドラインでnullターミネータを削除できます。

sed 's/\\0//g' mycsv.csv > mycsv.csv

または、@ marbelが示唆しているように、freadを使用すると、テキスト内でsed呼び出しを渡すことができます。といった:

fread("sed 's/\\0//g' mycsv.csv")
14

この小さな機能をテストできます:

cleanFiles<-function(file,newfile){
  writeLines(iconv(readLines(file,skipNul = TRUE)),newfile)
}

それは私の仕事です

4
xrsousa

この場合、freadではなく、UTF-16LEのfileEncodingでread.csvを使用できます。

read.csv("mycsv.csv",fileEncoding="UTF-16LE")

データサイズを考慮すると、read.csvの使用には数分かかりますが、大したことではないと思います。

4
Fan Wang

これを解決する非技術的な方法は、

  1. 問題のある。csvを開きます

  2. Ctrl + A(すべて選択)

  3. 新しいExcelシートを開く

  4. 右クリックして「値として貼り付け」を選択します

  5. 元のファイルの代わりにこのファイルを保存して使用します。

私のために働いて、多くの時間はかかりません。

2
Pree

ASCIIファイルでNUL(x00)文字が表示されている場合、これを行うことができます:data.table :: fread(text = readLines(pathIn、skipNul = T)、...)

1
Jim Cutler