【问题标题】:How do I read a CSV that has blank columns caused by extra separators at the end of each row?如何读取每行末尾有额外分隔符导致的空白列的 CSV?
【发布时间】:2020-06-07 04:37:23
【问题描述】:

假设我有以下 CSV,它有 6 列包含数据:

METB;Metropolis Municipal Bonds   ;100;BOND   ;MAIN     ;2020-01-23;
PFM ;Precision Food Manufacturing ;121;EQUITY ;MAIN     ;2020-12-30;
NLT ;Northern Light and Telegraph ;47 ;EQUITY ;MAIN     ;2020-03-21;
PAE ;Peninsula Aeronautical Inc   ;75 ;EQUITY ;SECONDARY;2020-11-11;

请注意,CSV 文件在每一行的末尾包含一个额外的分隔符(即尾随 ;),这会导致 R 将我的 CSV 视为有 7 列而不是 6 列。

我目前正在使用以下方式读取 CSV:

df <- read.csv(
    './data.csv',
    header=FALSE,
    sep=';',
    strip.white=TRUE,
    col.names=c('ticker',
                'name',
                'price',
                'type',
                'board',
                'date',
                'unused.column'),  # <- ATTENTION.
    colClasses=c(ticker='character',
                 name='character',
                 date='Date',
                 unused.column='NULL'))  # <- ATTENTION.

这适用于同时执行所有这些操作:

  • 读取 CSV,
  • 为列指定正确的名称(而不是 V1V2 等),
  • 为列提供正确的类(例如characterDate 等),
  • 忽略最后一列

但是,我觉得我的解决方案很脏,因为我必须明确地为空白列命名(即unused.column)才能使用colClasses 中的"NULL" 将其删除。如果我的 CSV 在每行的末尾包含多个空白列(例如;;;;;;),我当前使用的方法将开始变得不切实际。

在读取 CSV 时忽略最后一列,同时为每列提供正确的标题名称并为每列提供正确的类,有什么更好的方法?

【问题讨论】:

  • 我其实很喜欢你现在的方法。您真的希望在您的输入 CSV 中有这么多未使用的列吗?
  • @TimBiegeleisen 是的,我希望我的输入 CSV 中有许多未使用的列。我宁愿不必将它们命名为unused.column.1unused.column.2unused.column.3 等。

标签: r csv


【解决方案1】:

您可以使用data.tablefread 指定要读取的列数:

data.table::fread('./data.csv', select = 1:6, 
              col.names=c('ticker','name','price','type','board','date'))

【讨论】:

    【解决方案2】:

    我们可以使用vroom

    library(vroom)
    vroom('./data.csv', col_select = c(ticker, name, price, type, board, date))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-11
      • 2012-04-26
      • 2021-06-06
      • 2020-12-26
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多