【问题标题】:Cannot read text file using csv?无法使用 csv 读取文本文件?
【发布时间】:2012-09-27 07:21:44
【问题描述】:

我有一个用“逗号”分隔的文本数据,即“”。数据示例如下(第一行表示列名):

userID,appName,startTime,endTime,endResult
chhieut,gms.mos.test,2012-07-01 02:47:16,2012-07-01 02:47:46,1
chhieut,gms.mos.test,2012-07-01 03:11:46,2012-07-01 03:12:25,2
chhieut,gms.mos.test,2012-07-01 03:13:36,2012-07-01 03:14:03,2
chhieut,gms.mos.test,2012-07-01 03:18:26,2012-07-01 03:18:58,2
chhieut,gms.mos.test,2012-07-01 04:10:36,2012-07-01 04:10:54,2
chhieut,gms.mos.test,2012-07-01 04:38:26,2012-07-01 04:38:48,2
chhieut,gms.mos.test,2012-07-01 04:48:56,2012-07-01 04:49:04,3
chhieut,gms.mos.test,2012-07-01 05:49:46,2012-07-01 05:50:14,2
chhieut,gms.mos.test,2012-07-01 06:19:07,2012-07-01 06:19:25,2
chhieut,gms.mos.test,2012-07-01 07:09:17,2012-07-01 07:09:47,2

我正在使用以下语法:

appsession <- read.table("C:/.../AppSession.txt", sep = ",", 
  col.names = c("userID","appName","startTime","endTime","endResult"), 
  fill = FALSE, strip.white = TRUE)

我收到此错误:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
  line 1 did not have 5 elements

【问题讨论】:

  • 试试:read.csv("C/Document/.....", header=TRUE) 可以吗?
  • 但数据是文本文件..所以我没有尝试.csv
  • 一个 csv 文件是文本文件。它只是表示这些值已用逗号分隔。
  • 我刚刚使用了 read.csv 但没有读取任何观察结果。我打印了前 20 个 obs,它是这样来的: userID appName startTime endTime endResult 1 NA NA NA NA NA 2 NA NA NA NA NA 3 NA NA NA NA NA 4 NA NA NA NA NA 5 NA NA NA NA NA 6 NA NA NA NA NA 7 NA NA NA NA NA
  • 这些空行是故意的吗?第 1 行,如果从 0 开始,则表示空行,即。自然会导致错误,因为那里没有元素。尝试删除那些。我的猜测是因为我不确定 strip.white 在什么级别上删除了空白(如果它包括空行或在每个元素上隔离的工作)。 (提示:您可以只删除第一个空白行 - 如果错误移动到第 2 行,那么您肯定知道它是那些空白行)

标签: r csv


【解决方案1】:

我认为如果您有一个空行并且计划使用“col.names”而不使用header=TRUE,则需要使用skip = 2。目前,您的代码可以通过简单的文本读取(无论如何都可以正常工作)“

> txt <- "userID,appName,startTime,endTime,endResult
+ chhieut,gms.mos.test,2012-07-01 02:47:16,2012-07-01 02:47:46,1
+ chhieut,gms.mos.test,2012-07-01 03:11:46,2012-07-01 03:12:25,2
+ chhieut,gms.mos.test,2012-07-01 03:13:36,2012-07-01 03:14:03,2
+ chhieut,gms.mos.test,2012-07-01 03:18:26,2012-07-01 03:18:58,2
+ chhieut,gms.mos.test,2012-07-01 04:10:36,2012-07-01 04:10:54,2
+ chhieut,gms.mos.test,2012-07-01 04:38:26,2012-07-01 04:38:48,2
+ chhieut,gms.mos.test,2012-07-01 04:48:56,2012-07-01 04:49:04,3
+ chhieut,gms.mos.test,2012-07-01 05:49:46,2012-07-01 05:50:14,2
+ chhieut,gms.mos.test,2012-07-01 06:19:07,2012-07-01 06:19:25,2
+ chhieut,gms.mos.test,2012-07-01 07:09:17,2012-07-01 07:09:47,2
+ "
> appsession <- read.table(text=txt, sep = ",", 
+   col.names = c("userID","appName","startTime","endTime","endResult"), 
+   fill = FALSE, strip.white = TRUE)
> 
> appsession
    userID      appName           startTime             endTime endResult
1   userID      appName           startTime             endTime endResult
2  chhieut gms.mos.test 2012-07-01 02:47:16 2012-07-01 02:47:46         1
3  chhieut gms.mos.test 2012-07-01 03:11:46 2012-07-01 03:12:25         2
4  chhieut gms.mos.test 2012-07-01 03:13:36 2012-07-01 03:14:03         2
5  chhieut gms.mos.test 2012-07-01 03:18:26 2012-07-01 03:18:58         2
6  chhieut gms.mos.test 2012-07-01 04:10:36 2012-07-01 04:10:54         2
7  chhieut gms.mos.test 2012-07-01 04:38:26 2012-07-01 04:38:48         2
8  chhieut gms.mos.test 2012-07-01 04:48:56 2012-07-01 04:49:04         3
9  chhieut gms.mos.test 2012-07-01 05:49:46 2012-07-01 05:50:14         2
10 chhieut gms.mos.test 2012-07-01 06:19:07 2012-07-01 06:19:25         2
11 chhieut gms.mos.test 2012-07-01 07:09:17 2012-07-01 07:09:47         2

您应该使用标题或跳过标题行(加上跳过任何空白行。)查看有多少行是空白的一种方法是查看countfields( ..., sep=",") 的输出。另一种查看 read.*scan 函数“看到”什么的方法是执行此代码(适当替换省略号):

appLines <- readLines("C:/.../AppSession.txt")
appLines[1:5] # will display the first 5 lines from that file 
              # with no attempt to deal with any separators.

【讨论】:

  • 我的原始数据中没有空白行......我只是用它们来帮助读者理解观察结果
  • 正如我所写:使用count.fields ...即使您认为没有空白行,它也会显示scan 函数逐行检测的字段数。
【解决方案2】:

使用经过适当编辑的数据版本(即删除所有空白行!),可以通过read.csv() 轻松将其加载到 R 中。请注意,这里我使用包含数据的文本连接来避免将数据写入文件。只需将con 替换为read.csv() 中的文件名即可。

con <- textConnection("userID,appName,startTime,endTime,endResult
chhieut,gms.mos.test,2012-07-01 02:47:16,2012-07-01 02:47:46,1
chhieut,gms.mos.test,2012-07-01 03:11:46,2012-07-01 03:12:25,2
chhieut,gms.mos.test,2012-07-01 03:13:36,2012-07-01 03:14:03,2
chhieut,gms.mos.test,2012-07-01 03:18:26,2012-07-01 03:18:58,2
chhieut,gms.mos.test,2012-07-01 04:10:36,2012-07-01 04:10:54,2
chhieut,gms.mos.test,2012-07-01 04:38:26,2012-07-01 04:38:48,2
chhieut,gms.mos.test,2012-07-01 04:48:56,2012-07-01 04:49:04,3
chhieut,gms.mos.test,2012-07-01 05:49:46,2012-07-01 05:50:14,2
chhieut,gms.mos.test,2012-07-01 06:19:07,2012-07-01 06:19:25,2
chhieut,gms.mos.test,2012-07-01 07:09:17,2012-07-01 07:09:47,2
")

dat <- read.csv(con,
                colClasses = c(rep("character", 2), rep("POSIXct", 2),
                               "numeric"))
close(con) ## closing connection, not needed with a file

还请注意,通过指定 colclasses 参数,我们在读取数据之前告诉 R 数据是什么,这样可以稍后保存一些格式,尤其是 DateTime 数据。我们可以在这里执行此操作,因为您以正确的格式存储了 DateTime 变量。

R> head(dat)
   userID      appName           startTime             endTime endResult
1 chhieut gms.mos.test 2012-07-01 02:47:16 2012-07-01 02:47:46         1
2 chhieut gms.mos.test 2012-07-01 03:11:46 2012-07-01 03:12:25         2
3 chhieut gms.mos.test 2012-07-01 03:13:36 2012-07-01 03:14:03         2
4 chhieut gms.mos.test 2012-07-01 03:18:26 2012-07-01 03:18:58         2
5 chhieut gms.mos.test 2012-07-01 04:10:36 2012-07-01 04:10:54         2
6 chhieut gms.mos.test 2012-07-01 04:38:26 2012-07-01 04:38:48         2
R> str(dat)
'data.frame':   10 obs. of  5 variables:
 $ userID   : chr  "chhieut" "chhieut" "chhieut" "chhieut" ...
 $ appName  : chr  "gms.mos.test" "gms.mos.test" "gms.mos.test" "gms.mos.test" ...
 $ startTime: POSIXct, format: "2012-07-01 02:47:16" "2012-07-01 03:11:46" ...
 $ endTime  : POSIXct, format: "2012-07-01 02:47:46" "2012-07-01 03:12:25" ...
 $ endResult: num  1 2 2 2 2 2 3 2 2 2

【讨论】:

  • @Gavin... 我使用了以下代码:> appsession
  • read.table 中的错误(file = file,header = header,sep = sep,quote = quote,:未使用的参数(conClasses = c(“character”,“character”,“ POSIXct", "POSIXct", "numeric")).. 这是我得到的错误
  • colClasses,不是conClasses!该错误甚至告诉您您提供了一个未使用的参数。请检查您是否正确复制了代码。
  • 警告信息:在 read.table(file = file, header = header, sep = sep, quote = quote, : cols = 1 != length(data) = 5
  • 数据看起来像:ÿþu结构(c(“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“ ", "", "", 结构(c("NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 1 NA 2
【解决方案3】:

您需要提供指向实际数据集的链接,因为您提供的数据可以正常工作:

d = read.csv(textConnection("userID,appName,startTime,endTime,endResult
chhieut,gms.mos.test,2012-07-01 02:47:16,2012-07-01 02:47:46,1
chhieut,gms.mos.test,2012-07-01 03:11:46,2012-07-01 03:12:25,2
chhieut,gms.mos.test,2012-07-01 03:13:36,2012-07-01 03:14:03,2
chhieut,gms.mos.test,2012-07-01 03:18:26,2012-07-01 03:18:58,2
chhieut,gms.mos.test,2012-07-01 04:10:36,2012-07-01 04:10:54,2
chhieut,gms.mos.test,2012-07-01 04:38:26,2012-07-01 04:38:48,2
chhieut,gms.mos.test,2012-07-01 04:48:56,2012-07-01 04:49:04,3
chhieut,gms.mos.test,2012-07-01 05:49:46,2012-07-01 05:50:14,2
chhieut,gms.mos.test,2012-07-01 06:19:07,2012-07-01 06:19:25,2
chhieut,gms.mos.test,2012-07-01 07:09:17,2012-07-01 07:09:47,2"), header=TRUE)

快速检查:

R> head(d, 1)
   userID      appName           startTime             endTime endResult
1 chhieut gms.mos.test 2012-07-01 02:47:16 2012-07-01 02:47:46         1
R> dim(d)
[1] 10  5

确保您的实际文件中没有空行 - 这真的会填满东西。

【讨论】:

  • 能不能把同样的数据保存成文本格式,看看解决办法?我的 dta 很大,出于安全原因,我将其上传到任何地方
  • 您可以将文件加载到 Excel 中吗?
  • @user1702490 以上数据和其他问题都是文本格式。就 R 而言,read.csv() 提供了与连接相同的字节集,就像从文件加载数据时一样。文件不太容易显示为可重现的示例。只需将 textConnection(...) 位替换为文件名即可。尝试使用数据的前 100 行,如果可行,那么您知道文件后面有问题,因此请检查格式等。
  • 不可能.. 因为它有超过 300 万个观测值
猜你喜欢
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
相关资源
最近更新 更多