You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:R读取Meltwater导出CSV文件报错,求无需转存的批量解法

解决Meltwater导出CSV文件在R中读取失败的问题

问题背景

从Meltwater导出带特定关键词的推文/新闻文件,后缀为.csv,但执行以下R代码读取时:

test <- read.csv("C:/Users/Usuario/Downloads/esto_es_una_prueba - Nov 24, 2022 - 11 40 37 AM.csv")

触发如下错误及警告:

Error in make.names(col.names, unique = TRUE) : 
  invalid multibyte string at '<ff><fe>D'
In addition: Warning messages:
1: In read.table(file = file, header = header, sep = sep, quote = quote,  :
  line 1 appears to contain embedded nulls
2: In read.table(file = file, header = header, sep = sep, quote = quote,  :
  line 2 appears to contain embedded nulls
3: In read.table(file = file, header = header, sep = sep, quote = quote,  :
  line 3 appears to contain embedded nulls
4: In read.table(file = file, header = header, sep = sep, quote = quote,  :
  line 4 appears to contain embedded nulls
5: In read.table(file = file, header = header, sep = sep, quote = quote,  :
  line 5 appears to contain embedded nulls

用Excel打开文件显示为正常表格,但修改sep参数、尝试以.xlsx格式读取均无效,仅能通过Excel转存后才能在R中读取。需批量处理大量文件,希望跳过转存步骤。

原因分析

Meltwater导出的文件名义上是.csv,实际是UTF-16 LE编码的制表符分隔(TSV)文件:

  • 错误中的<ff><fe>是UTF-16LE的字节顺序标记(BOM),read.csv默认使用UTF-8编码,无法识别该编码导致多字节字符串错误;
  • 文件用制表符而非逗号分隔列,read.csv默认逗号分隔,因此无法正确解析列结构;
  • 嵌入空值警告是UTF-16编码在UTF-8解析下的表现。

解决方案

方法1:使用Base R直接读取

指定正确的编码和分隔符即可:

test <- read.table(
  "C:/Users/Usuario/Downloads/esto_es_una_prueba - Nov 24, 2022 - 11 40 37 AM.csv",
  sep = "\t",          # 制表符分隔
  fileEncoding = "UTF-16LE",  # 匹配文件编码
  header = TRUE,       # 文件包含表头
  stringsAsFactors = FALSE
)

方法2:使用readr包(适合批量/大文件)

readr属于tidyverse工具集,处理大文件效率更高,语法更简洁:

library(readr)

test <- read_tsv(
  "C:/Users/Usuario/Downloads/esto_es_una_prueba - Nov 24, 2022 - 11 40 37 AM.csv",
  locale = locale(encoding = "UTF-16LE")
)

批量处理示例

结合purrr包可以快速处理文件夹内所有Meltwater导出文件:

library(readr)
library(purrr)
library(dplyr)

# 获取目标文件夹内所有csv文件路径
file_paths <- list.files(
  path = "C:/Users/Usuario/Downloads",
  pattern = "\\.csv$",
  full.names = TRUE
)

# 批量读取所有文件到列表
data_list <- map(file_paths, ~read_tsv(.x, locale = locale(encoding = "UTF-16LE")))

# 合并所有数据为单个数据框
combined_data <- bind_rows(data_list)

内容的提问来源于stack exchange,提问作者Carmen Tello

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:03:17