'embedded nul in string' 尝试从 R 中的不同子目录批量导入多个 .csv 文件时出错

'embedded nul in string' error trying to import multiple .csv files en masse from different subdirectories in R

我有大量的 csv 数据文件,它们位于许多不同的子目录中。所有文件同名,以子目录名区分。

我正在尝试找到一种将它们全部导入 r 的方法,使每个文件的子目录名称填充数据文件中的一列。

我使用 list.files() 生成了一个文件列表,我称之为 tto_refs.

head(tto_refs) 1 "210119/210115 2021-01-19 16-28-14/REF TTO-210119.D/REPORT01.CSV" "210122/210115 2021-01-22 14-49-41/REF TTO-210122.D/REPORT01.CSV"
[3] "210127/210127 2021-01-27 09-39-15/REF TTO-210127_1.D/REPORT01.CSV" "210127/210127 2021-01-27 09-39-15/REF TTO-210127_2.D/REPORT01.CSV"
[5] "210127A/210127 2021-01-28 15-57-40/REF TTO-210127A_1.D/REPORT01.CSV" "210127A/210127 2021-01-28 15-57-40/REF TTO-210127A_2.D/REPORT01.CSV"

我尝试了几种不同的方法将数据导入 r,但它们都有与 'embedded nul(s)' 有关的错误。

例如, tbl <- tto_refs %>% map_df(~read.csv(.))

有 50 个或更多警告(使用 warnings() 查看前 50 个)

warnings() Warning messages: 1: In read.table(file = file, header = header, sep = sep, ... : line 1 appears to contain embedded nulls 2: In read.table(file = file, header = header, sep = sep, ... : line 2 appears to contain embedded nulls

等等

如何将这些数据导入 R?

编辑:.csv 文件是从安捷伦化学工作站分析软件生成的。

数据如下所示:

您的文件采用 UTF-16(或 UCS-2)字符编码。这意味着每个字符由两个字节表示。因为数据只包含ASCII字符,所以每个字符的第二个字节为0。

因为 R 期望每个字符一个字节的编码,它认为第二个字节是空字符,不应出现在 CSV 文件中。

此外,这些文件在第一行的开头包含一个字节顺序标记,正在转换为垃圾。您需要一个 UTF-16 到 UTF-8 的转换器程序。这也应该删除字节顺序标记(UTF-8 中不需要)。

我个人会使用工具 iconv. If I were using Windows I would use Cygwin 来安装它。

for f in *.CSV
  do iconv -f UTF-16 -t UTF-8 <"$f" >"${f%.CSV}-utf8.csv"
done

如果您不喜欢这种方法,可以列出其他几种工具作为 this question 的答案。