使用 rxImport 函数将 CSV 文件读入 .Xdf 文件时抑制双引号内的逗号

Posted

技术标签:

【中文标题】使用 rxImport 函数将 CSV 文件读入 .Xdf 文件时抑制双引号内的逗号【英文标题】:Suppressing comma inside double quotes while reading CSV file into .Xdf file Using rxImport function 【发布时间】:2015-06-27 09:06:00 【问题描述】:

我正在尝试使用带有以下代码的 rxImport() 函数将大型 .CSV 文件转换为 .Xdf 文件:

rxImport(inData = "/poc/revor/data/ext_roll36_chrg_vol.csv",
         outFile = "/poc/revor/data/ext_roll36_chrg_vol.xdf", 
         overwrite = TRUE, rowsPerRead = 100000,
         colClasses = c(SE_NO = "character", 
                        HIER_ROLLUP_CD = "character", 
                        CUR_MO_CT ="numeric", 
                        CUR_MO_AM = "numeric", 
                        AD_LINE_1_TX = "character",
                        AD_LINE_2_TX = "character",
                        SUBMIT_DT = "character", 
                        UPDT_TS = "character"),
         transforms = list(SUBMIT_DT = as.Date(SUBMIT_DT, format="%d%b%Y")))

但这个文件包含许多记录,例如:

0200001097,SS,625,236899.000,"KRAV MAGA WORLDWIDE, INC.","KRAV MAGA WORLDWIDE, INC.",01MAY2014,07JUN2014:01:08:57.000000

如您所见,AD_LINE_1_TXAD_LINE_2_TX 列在双引号内包含逗号。

我曾尝试使用type = "text" 参数,但随后它将第一列(即SE_NO)读取为numeric,即使它的类型显示为character。这是我想读取为character 的所有numeric 字段的问题。

如果我使用 transform 参数将列转换为 character 为:

transforms = list(SE_NO = as.character(as.numeric(SE_NO)))

那么SE_NO列的值在从字符(指数表示)2.000011e+08到数字的转换中从0200001097变为0200001000

那么有没有其他方法可以在不影响其他列的情况下抑制双引号内的逗号?

如果需要任何进一步的信息,请告诉我。

【问题讨论】:

这个CSV 有标题行吗? 【参考方案1】:

这应该可以满足您的需求...

input_file <- "/poc/revor/data/ext_roll36_chrg_vol.csv"
output_file <- "/poc/revor/data/ext_roll36_chrg_vol.xdf"

my_colInfo <- list(list(index = 1, type = "character", newName = "SE_NO"),
                   list(index = 2, type = "character", newName = "HIER_ROLLUP_CD"),
                   list(index = 3, type = "numeric", newName = "CUR_MO_CT"),
                   list(index = 4, type = "numeric", newName = "CUR_MO_AM"),
                   list(index = 5, type = "character", newName = "AD_LINE_1_TX"),
                   list(index = 6, type = "character", newName = "AD_LINE_2_TX"),
                   list(index = 7, type = "character", newName = "SUBMIT_DT"),
                   list(index = 8, type = "character", newName = "UPDT_TS"))

input_source <- RxTextData(file = input_file, 
                           colInfo = my_colInfo,
                           delimiter = ",",
                           quotedDelimiters = TRUE,
                           useFastRead = TRUE)

rxImport(inData = input_source,
         outFile = output_file, 
         overwrite = TRUE, rowsPerRead = 100000,
         transforms = list(SUBMIT_DT = as.Date(SUBMIT_DT, format="%d%b%Y")))

【讨论】:

非常感谢您的解决方案,它确实抑制了引号,但它再次显示错误:rxCall(“Rx_ImportDataSource”,params)中的错误:可能是由于列“AD_LINE_1_TX”的值具有值为 """KIMBEL PLUMBING, INC.""" 的值,即在值之前和之后有三个引号。那么有什么办法可以去掉这个专栏中出现的多余引号呢?

以上是关于使用 rxImport 函数将 CSV 文件读入 .Xdf 文件时抑制双引号内的逗号的主要内容,如果未能解决你的问题,请参考以下文章

使用分块将 CSV 文件读入 Pandas 数据帧,生成单个目标数据帧

使用 pandas 将 csv 文件中的数据读入时间序列

Pandas.read_csv 将所有文件读入一列

如何在不使用databricks csv api的情况下直接将CSV文件读入spark DataFrame?

有效地将最后 'n' 行 CSV 读入 DataFrame

VB.NET:将 CSV 文件读入二维数组