编辑逗号分隔值(CSV)文件的策略


18

在进行数据分析项目时,我经常将数据存储在逗号或制表符分隔(CSV,TSV)数据文件中。虽然数据通常属于专用的数据库管理系统。对于我的许多应用程序来说,这会做得过多。

我可以在Excel(或大概是其他电子表格程序)中编辑CSV和TSV文件。这样有好处:

  • 电子表格可轻松输入数据

还有几个问题:

  • 使用CSV和TSV文件会导致许多警告消息,提示丢失各种功能以及仅保存活动工作表的方式等等。因此,如果您只想打开文件并进行一些更改,则很烦人。
  • 它执行许多“理应智能”的转换。例如,如果输入12/3,它将认为您要输入日期。 更新:我应该提到日期示例只是许多示例之一;大多数问题似乎与不当转换有关。特别是,看起来像数字或日期的文本字段会引起问题。

另外,我可以在标准文本编辑器中直接使用文本文件。这样可以确保我输入的是记录的内容。但是,这是输入数据的一种非常尴尬的方式(列不对齐;仅将数据输入到多个单元格中很难;等等)。

  • 使用CSV或TSV数据文件的最佳策略是什么?也就是说,什么策略可以使输入和操作数据变得容易,同时又确保您输入的内容得到了正确的解释?

1
您实际上对文件执行哪种操作?在我看来,这极大地影响了可接受的选择范围。另外,在我看来,您可以在文字处理器中编辑TSV数据并排列标签以保留列-只要您可以将文字处理器设置为不执行“智能”转换并可以另存为纯文本即可, 。
韦恩2010年

@韦恩好点。因为我是在电子表格程序的基础上长大的,所以我熟悉许多快捷方式(功能,复制和粘贴,添加额外的列等等)。注意,这里我不是在谈论数据分析,而只是创建一个简单的表格数据文件(例如,处理我的R代码所需的一些元信息)。虽然我可以在R中完成所有这些基本的表操作,但对我来说却不那么直观。可能随着时间的流逝,在R中打开一个csv,进行一些小的更改然后再次保存将成为我的首选。
Jeromy Anglim 2010年

Answers:


14
  1. 如果您对R感到满意,则可以创建基本的data.frame,然后在其上使用fix()函数输入数据。与#5相同,设置data.frame后,您可以使用一系列readLines(n = 1)(或其他方法)来获取数据,对其进行验证,并提供添加下一个数据的机会。行。然后将修复保留为fix()。请参见下面使用scan()的实现示例。

  2. excel中的另一个选项可能比较混乱,但是您可以键入12/9,然后让另一列评估= IFERROR(MONTH(DateEntryCell)/ DAY(DataEntryCell),DataEntryCell)。但是,随后您必须维护excel表和csv表,并且在编写csv时所有的抱怨都会持续存在。

  3. 另外,只要您的字段相对较短且长度一致,常规文本编辑器就可以很好地为您提供TSV服务。完成后,您始终可以在excel中加载它,并确保每行的列数与期望的一样。
  4. Emacs在许多平台上都可用,并且可能为此提供了一些功能,例如http://www.emacswiki.org/emacs/CsvMode
  5. 如果您是一个热心的人,那么用编程语言快速编程某些东西来进行数据输入是微不足道的,那么数据编辑就会困难得多。
  6. 谷歌快速搜索显示了仅用于此目的的软件,但是没有免费软件似乎没有什么用。
  7. 听起来很疯狂,但是超级用户建议在Access中编辑表,然后将它们导出为CSV ...这简直太疯狂了,无法正常工作。
  8. 保存为.csv并不会阻止excel发出抱怨,但是您可以在数据输入字段之前键入一个单引号,并且就自动格式化而言,它就不用管它了。很好,这(至少在Office 2007中)不会在csv文件中留下撇号。

更新: 我一直在这个问题上反复讨论,因为这也是我的一个问题。到目前为止,到目前为止,我所见过的最好/最简单的数据输入解决方案是KillinkCSV。它不是“免费”软件,而是具有30天试用期和合理价格(约27美元)的共享软件。不过,我不确定我对编辑现有CSV的信任程度如何-我将其交给了一个非常大(且可能格式正确)的CSV,但它无法读取所有行。但是,对于一个相当大的文件(20 MB),它似乎运行良好,并且较大文件的问题可能是我方面的用户错误。

R示例:

#This function takes a what argument like in scan, 
#a list with the types to be used, see usage example 
#at the end of this code block
#dataEntry will keep reading in values until 
#the values it reads in matches what is in 
#"terminateon".
#limitations: Many
dataEntry <- function(what,terminateon)
{
  CONTINUE <- TRUE #Make sure we start the loop
  data <- NULL #Create empty data so that the data.frame can define itself
  ti <- NULL
  while(CONTINUE)
  {
    ti <- NULL    
    ti <- tryCatch(
      {as.data.frame(scan(what=what, nlines=1, multi.line=FALSE, comment.char="",quiet=TRUE))},
      error=function (e) {print("Error in data entry! Line not stored.")
                          return(NULL)},
      warning=function(w) {print("Error in data entry! Line not stored.")
                           return(NULL)},
      finally={ti <- NULL}
    ) #Try getting the data according to the parameters in 'what' one row at a time.
    if (!is.null(ti))
    {
      if ((ncol(ti)==length(what)) & (nrow(ti)==1)) {
        data <- rbind(data,ti) #If there wasn't an error, add ti to the previous value  
      } else {
        print("Too many or not enough values on previous entry.")
        print("Tail of current data:")
        print(tail(data))
      }
    }
    if (!is.null(ti) & all(ti == terminateon)) 
    {
      CONTINUE <- FALSE
      data <- data[-c(nrow(data)),]
    } #if we've recieved the final value we won't continue and the last row is invalid so we remove it
  }
  return(data)
}

dataEntry(list(x=integer(), y=numeric(), z=character()),terminateon=c(999,999,"Z"))

是的,事实证明我已经csv-mode.el安装emacs-goodies-el了Debian / Ubuntu中的软件包了-整洁。
Dirk Eddelbuettel,2010年

1
+1,对于第一点,我曾经使用过的所有统计软件(R,Stata,SPSS和SAS除外)都提供了此类功能。因此,您的建议可以推广到某人想要使用的任何软件。
Andy W 2010年

5

更新: [经历过来自R-Help的大量电子邮件积压]我想起了有关“ The behavior ofread.csv() ”的主题。在这篇文章中,Duncan Murdoch提到出于Jeromy提到的某些原因,他更喜欢使用数据交换格式(DIF)文件而不是csv。我只是尝试了一下,但Gnumeric弄错了(加载12/3作为日期),但是OpenOffice.org正确读取了此信息并完整保留了12/3信息。(有人想在MS Excel中检查吗?)

DIF文件是纯文本,可以由电子表格读取,并且R(只要您使用最新的R版本(SVN版本> = r53778))就可以以正确的格式读取数据。


原文:我会尽量避免使用电子表格句号进行数据编辑/操作。记录您对现有数据集所做的任何更改都非常困难,即使不是不可能,因此从可重现的研究角度来看,几乎可以将其排除在外。最多,我使用电子表格可以快速查看现有数据。

对于数据处理,我倾向于编写一个R脚本,该脚本将使用原始的csv文件并应用所需的所有必要处理步骤。我对该脚本进行了大量评论,以确切解释我在每个阶段的工作以及原因。然后,我的数据分析脚本将调用加载和处理数据的数据处理脚本。

对于数据输入,在文本编辑器或电子表格中输入数据是否更麻烦?我怀疑您为后者提到的问题不会超过尝试将CS​​V数据输入文本编辑器的问题。

您可以尝试使用更好的电子表格;OpenOffice.org拒绝停止将12/3格式化为日期(或将其转换为数字表示形式),即使先将列格式化为“数字”也是如此。另一方面,如果首先将列格式设置为“数字”,则数字将保持12/3不变。

您可以通过'在条目前添加a 来强制OpenOffice.org将日期重新格式化为12/3 ,即'12/3在电子表格中将其显示为12/3并另存为文本。这可能很安全使用。

不知道为什么要在文本文件中将12/3以数字形式存储为12/3-像R这样的东西应该怎么读呢?

您对有关丢失功能或仅保存活动工作表的警告的评论不是真正的问题吗?(如果是,那么我想在我的生活中遇到您的问题;-)


关于可重现的研究,如果文件格式为CSV,则可以在进行更改时通过提交轻松地将CSV文件置于版本控制下。这足以进行可重复的研究吗?关于数据输入,我经常以固定宽度格式进行或让其他人进行原始数据输入,以使效率最大化。但是我更喜欢将数据存储为CSV或TSV(我发现它更透明);关于将列格式化为数字。此信息可能会在保存时丢失。
Jeromy Anglim

关于12/3,我有一个选择题测试的示例,其中表示12除以3。但是,我将其更多地用作说明性示例。当我有一个很大的CSV文件时,我什至不希望进行一次不合适的转换。关于警告,如果我每天打开CSV文件10次,警告就会变得很乏味。他们还会使我不清楚是否确实保存了CSV文件。对不起,咆哮。
Jeromy Anglim

@Jeromy是的,如果您严格进行单个更改(或单个数据处理步骤),则可以立即保存并提交。我的意思是不包含有关使用脚本在R(因为这是我的首选语言)中进行处理的注释。这就是我与同事发送给我的数据一起工作的方式。我可能会快速浏览电子表格,然后将csv读入R并编写一个脚本,其中包含我需要应用的所有数据处理步骤。然后,我对该脚本进行注释,以便记录下我所做的事情以及为什么这么做,并且根本没有更改原始数据文件。
恢复莫妮卡-G.辛普森2010年

@杰罗米:警告上的一点。我很早以前就将它们过滤掉为噪音,所以它们不会打扰我。我刚刚测试了Gnumeric和OpenOffice.org,它们自动将12/3的csv转换为日期,这真是垃圾!所以我明白你的意思。停止此操作的唯一方法是将这些数据存储为文本,并在加载/导入时强制该数据类型。
恢复莫妮卡-辛普森

@Jeromy:re:丢失数字格式-是的,除非您在导入时在(OpenOffice.org)中将列类型指定为“数字”(Gnumeric)或“文本”,否则它将丢失。最好将其存储为文本(请参见我编辑过的答案)以避免转换-您仍然需要在导入时指定数据类型...
恢复莫妮卡-G.辛普森2010年

3

我建议您查看谷歌优化(http://code.google.com/p/google-refine/)。我认为这是用于编辑CSV文件的非常好的工具


您能否解释一下这是如何响应问题中的战略要求的?
ub

3

我会避免同时使用CSV和TSV文件。取而代之的是学习使用SQL并仅对数据的数据集市或数据库(DB)副本进行操作,或者可以将SAS或R与数据库进行直通连接。这样,您就可以对数据进行批量更新,而不必在Excel(或您使用的任何电子表格程序)中执行可怕的查找和替换操作,或者进行复制和粘贴操作(这很容易出错)。使用数据库系统的好处还在于,如果错误地进行了所有更改并且可以对其进行审核,则可以启用日志记录并快速回滚所做的更改。另外,可以在数据库表上放置完整性约束,以确保您不会以您认为不合适的方式错误地更新或更改变量/列(例如,日期保留为日期,而其他信息则按类型强制转换)。我赢了'

如果您喜欢电子表格,因为它以某种方式简化了您的数据输入,那么可以通过使用数据库随附的图形用户界面工具/ IDE(例如Microsoft的Management Studio)或拉入链接的版本来克服我使用过的每个数据库中的数据将数据库存储到专门用于输入数据和强制执行数据约束的系统中(例如,Access或自定义Web界面中的链接表形式)。您还可以使用其他程序,让您两全其美,并在Excel中更新数据,并将这些更改传播到数据库中(例如,请参阅https://www.youtube.com/watch?v=5iyuF_mDSac) 。


2

这个问题后,我开始看看CSVed

从网站:

CSVed是一个简单而强大的CSV文件编辑器,您可以操作任何用任何分隔符分隔的CSV文件。

我不确定是否有人有经验。


我尝试安装它。快速尝试之后,似乎无法输入数据。也许如果我再尝试一下,我就能弄清楚如何有效地使用它,但我怀疑没有。
russellpierce 2010年

您能否解释一下这是如何响应问题中的战略要求的?
ub

2

Excel不太支持CSV。例如,如果您要在Excel中输入“ 1,300”,并将其另存为逗号分隔的值,它将让您满意!这可能是个大问题(从其他人接收文件时,我经常遇到它)。

我个人使用OpenOffice.org Calc,也使用上面列出的许多解决方案,但是其中许多解决方案不具备常规编辑所需的功能和易用性。OOO Calc比Excel聪明得多,尽管它是电子表格程序,但仍将必须输入“ = 12/3”而不是“ 12/3”,否则将输入值而不是计算。

旋转一下,您不会失望的。


1

我喜欢Gnumeric,因为它不会像其他人那样抗白痴(它不会对丢失的功能大喊大叫),并且可以处理大数据...但是我认为它仅适用于Linux。


1
遵循这个问题,我做了一个狩猎:有一个Windows版本projects.gnome.org/gnumeric/downloads.shtml
Jeromy Anglim 2010年

1
它确实警告您仅保存当前工作表(这是Jeromy的bug-bears之一),并且它具有恼人的功能,可以将正确保存的12/3数字转换为日期,除非您在导入时手动指定它们为数字(“数据”>“获取”无法加载外部数据>导入文本文件...)。
恢复莫妮卡-G.辛普森2010年

您能否解释一下这是如何响应问题中的战略要求的?
ub

1

只需使用Ron的Editor即可。就像Excel一样,没有“帮助”。

从站点:

Ron的编辑器是功能强大的表格文本或CSV编辑器。它可以打开任何格式的分隔文本,包括标准的逗号和制表符分隔的文件(CSV和TSV),并可以完全控制其内容和结构。

不仅可以编辑表格文本文件,还可以根据需要在许多额外的视图中轻松过滤和汇总它们,从而添加了强大的分析功能。

  • 许可证:免费供个人使用/评估
  • 运行于:Windows 32/64位2000 / XP / 2003 / Vista /

您能否解释一下这是如何响应问题中的战略要求的?
ub

1

我个人喜欢使用“关系数据库”的思想来管理CSV文件。CSV文件适合交换数据,但不包含业务逻辑。我使用CSV的经验是“业务上有很多迭代可以完善分析”。仅使用纯文本文件(CSV)将带来许多挑战。例如,CSV文件不会显示“什么使数据唯一”,即“每一行的主键”是什么。稍后,当我们有其他数据源要加入时,这将导致大问题。

SQLite是使CSV成为关系数据库的好工具,并且与CSV类似,它易于交换,并且不需要设置服务器。更重要的是,它在R和其他统计软件中的支持很好。

我的策略始终是在关系数据库中维护“清理的数据”。并在每个表的主键上保持清楚。

这是一个真实单词可能发生的示例(假设我们正在出售书籍):

  • 第1天,我收到了一个包含所有客户信息的CSV文件。
  • 第2天,我收到了另一个包含所有产品(书)信息的CSV文件。出于某种原因,企业表示没有可用的ISBN,并且书名和作者名的组合才是主键。
  • 第3天,Business发现需要考虑书籍的版本,他们发送了另一个CSV以“覆盖” day2的CSV。
  • 第4天,企业发现客户信息可以更新(例如地址更改),他们发送客户信息的更新版本。

现在,您可以看到清理数据的优势并将其保留在关系数据库中。以说客户ID为主要关键字,并以书名,作者和版本为主要关键字。进行数据更新和根据需要合并更改非常容易。此外,主键还为即将到来的新数据提供“约束”和“健全性检查”。


0

如果使用Excel的“导入数据”功能,它将为您提供选择每列数据类型的选项。您可以选择所有列并使用“文本”数据类型。


您能否解释一下这是如何响应问题中的战略要求的?
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.