在R中处理ASCII

时间:2012-12-20 12:15:20

标签: r ascii file-handling

我有一些人口普查的微数据文件存储为.txt并以ASCII编码。 当我在文本编辑器中打开它时,我会得到类似的结果: 1100015110001500100100003624008705865085282310200600101011022022 14 444231等。

由于我对ASCII数据的制表没有任何考虑,我想知道是否有任何办法可以用R和/或我需要什么类型的补充软件来完成。

实际上起初我想对我的数据进行“正常”查看,比如说,如果可能的话,将其视为一个表格(文件大小在40mb到500mb之间变化)。然后我想做一些简单的计算,然后将结果存储为csv。在其他情况下使用它。

有人能给我一些建议吗?

2 个答案:

答案 0 :(得分:7)

这个巴西人口普查网站提供了SAS输入脚本。仅使用SAS导入脚本导入ASCII数据集的最快方法是使用the SAScii package。您可以在this zipped file中找到SAS导入脚本 - 它是INPUT.txt。请注意,这些SAS导入指令的INPUT块在第四行之前不会启动,因此您的beginline参数将为4.测试您是否正在首先使用?parse.SAScii <正确读取SAS脚本/ p>

library(SAScii)
parse.SAScii( "INPUT.txt" , beginline = 4 )

一旦看到正确打印列名和宽度,就可以使用?read.SAScii函数直接将文本文件读入R数据框

x <- read.SAScii( "filename.txt" , "INPUT.txt" , beginline = 4 )
head( x )

如果您的文件太大而无法完全读入RAM,则可以将其读入SQLite数据库。使用不在SAScii包中但在my github account here中找到的read.SAScii.sqlite()函数 - 它只是read.SAScii()函数的一个小变化,但它不会使RAM过载。您可以在此united states government survey data set website上的下载脚本中查看其用法示例。

有关SAScii软件包的更多详细信息,请查看this overview

答案 1 :(得分:2)

一个很好的选择是包readrextremely fast solution来读取固定列宽数据。有关readr here的更多信息。

因此,您可以使用基于read.SAScii的更快的选项代替readr。像这样:

# Load Packages
  library(readr)
  library(SAScii)
  library(data.table)


# Parse input file
  dic_pes2013 <- parse.SAScii("INPUT.txt")

  setDT(dic_pes2013) # convert to data.table

# read to data frame
  pesdata2 <- read_fwf("./Dados/PES2013.txt", 
                       fwf_widths(dput(dic_pes2013[,width]),
                                  col_names=(dput(dic_pes2013[,varname]))),
                                  progress = interactive()
                                  )

我在1.2分钟内阅读了240万条包含243个变量的记录(文件Amostra_Pessoas_35_outras.txt)。

PS。如果您没有input.txt个文件,here是关于如何创建它们的简短脚本。

请注意,某些变量具有小数,这些内容未包含在此处发布的答案中提供的解决方案中(至少到目前为止)。要考虑到这一点,我建议使用R脚本here,这将帮助您下载2010年巴西人口普查数据集,将其读入数据框并将其另存为.csv个文件。