我正在尝试读取用刺定界的csv文件(最初是具有扩展名的日志文件)。

但是,简单的readLinesread.delim除了用“þ”作为分隔符外,默认函数将产生一列数据。

当我尝试打印数据框时,我得到:

temp <- readLines("sample.csv")
temp

[1] "12-31-2014-21:01:11þ0þþ4382037þ8048852þ286809041þ60534606þ1þ0x0þ1594842þ107607879þþ256þMDþ28þ0.0þ22þ13þ14915þ20646þþ1420088471"
[2] "12-31-2014-21:01:16þ0þþ4382037þ8048852þ286810825þ60533173þ1þ160x600þ1594842þ107606862þþ256þMDþ28þ0.0þ22þ13þ14915þ20646þþ1420088476"
[3] "12-31-2014-21:13:24þ0þþ4382037þ8048852þ286811019þ60532482þ1þ728x90þ1594842þ107607879þþ256þAZþ27þ0.0þ7þ189þ13541þ85747þþ1420089204"
[4] "12-31-2014-21:35:04þ2453419343309111450þþ4479850þ8209375þ283421530þ58729626þ1þ1x2þ1685249þ110242400þþ256þCOþ5þ9.0þ22þ171þ14885þ80120þþ1420090504"
[5] "12-31-2014-21:07:22þ2453942989496582297þþ4382037þ8048852þ284408073þ59306057þ1þ728x90þ1594842þ107607879þþ256þGAþ26þ0.0þ22þ26þ14981þ30093þþ1420088842"


现在我尝试用strsplit(temp,"þ")解析它并收到:

[[1]]
[1] "12-31-2014-21:01:11‏0‏‏4382037‏8048852‏286809041‏60534606‏1‏0x0‏1594842‏107607879‏‏256‏MD‏28‏0.0‏22‏13‏14915‏20646‏‏1420088471"

[[2]]
[1] "12-31-2014-21:01:16‏0‏‏4382037‏8048852‏286810825‏60533173‏1‏160x600‏1594842‏107606862‏‏256‏MD‏28‏0.0‏22‏13‏14915‏20646‏‏1420088476"

[[3]]
[1] "12-31-2014-21:13:24‏0‏‏4382037‏8048852‏286811019‏60532482‏1‏728x90‏1594842‏107607879‏‏256‏AZ‏27‏0.0‏7‏189‏13541‏85747‏‏1420089204"

[[4]]
[1] "12-31-2014-21:35:04‏2453419343309111450‏‏4479850‏8209375‏283421530‏58729626‏1‏1x2‏1685249‏110242400‏‏256‏CO‏5‏9.0‏22‏171‏14885‏80120‏‏1420090504"

[[5]]
[1] "12-31-2014-21:07:22‏2453942989496582297‏‏4382037‏8048852‏284408073‏59306057‏1‏728x90‏1594842‏107607879‏‏256‏GA‏26‏0.0‏22‏26‏14981‏30093‏‏1420088842"


或者,gsub("þ"," ",temp)仅返回原始打印。

这甚至变得“怪异”,因为如果我要从控制台复制并粘贴一行并运行:

temp1 <- "12-31-2014-21:01:11þ0þþ4382037þ8048852þ286809041þ60534606þ1þ0x0þ1594842þ107607879þþ256þMDþ28þ0.0þ22þ13þ14915þ20646þþ1420088471"


然后运行strsplit(temp1,split="þ")我将得到:

[[1]]
 [1] "12-31-2014-21:01:11" "0"                   ""                    "4382037"             "8048852"             "286809041"
 [7] "60534606"            "1"                   "0x0"                 "1594842"             "107607879"           ""
 [13] "256"                 "MD"                  "28"                  "0.0"                 "22"                  "13"
 [19] "14915"               "20646"               ""                    "1420088471"


我的最终目标是获得这种解析:22个不同列的数据帧。

我已将此“ sample.cav”文件加载到以下链接:

https://drive.google.com/file/d/0B4Krk6hHv0GoUUp4NkhmT1l2ZDQ/view?usp=sharing

我添加此链接是因为恐怕使用站点中的复制粘贴只会产生最终的结果,因此,为了重现此问题,需要下载文件(仅这5行)。

补充笔记:


我正在使用Windows计算机。
Excel工具“文本到列”可以成功解析此文件,但是我有多个文件太大,无法用excel处理,因此我希望在r中继续进行分析。


任何帮助将不胜感激!
多谢你们!

最佳答案

您有几种选择。

首先,您可以将定界符的unicode表示与内置的read.csv一起使用,它将很好地工作:

read.csv("sample.csv", sep="\xfe", header=FALSE)


您也可以将内置的read.delim与相同的参数一起使用。

哈德利(Hadley)的新readr程序包也具有一个read_delim起作用,但是它在\r列中添加了一个V22X22中的read.csv是什么):

library(readr)
read_delim("sample.csv", delim="\xfe", col_names=FALSE)


fread中的快速data.table也可以工作:

library(data.table)
fread("sample.csv", sep="\xfe")


最后,您可以使用strsplitrbind.data.frame

do.call(rbind.data.frame,
        strsplit(readLines("sample.csv"), "\xfe", useBytes=TRUE, fixed=TRUE))


但是您需要设置适当的列名称,然后再转换为可用的类型。

10-01 20:18
查看更多