我正在尝试读取以荆棘分隔的 csv 文件(最初是扩展名已更改的日志文件)。
然而简单 readLines
或 read.delim
除了“þ”作为分隔符之外,不要使用默认函数生成一个列式 data.frame
当我尝试打印数据框时,我得到:
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:110438203780488522868090416053460610x01594842107607879256MD280.0221314915206461420088471"
[[2]]
[1] "12-31-2014-21:01:16043820378048852286810825605331731160x6001594842107606862256MD280.0221314915206461420088476"
[[3]]
[1] "12-31-2014-21:13:24043820378048852286811019605324821728x901594842107607879256AZ270.0718913541857471420089204"
[[4]]
[1] "12-31-2014-21:35:042453419343309111450447985082093752834215305872962611x21685249110242400256CO59.02217114885801201420090504"
[[5]]
[1] "12-31-2014-21:07:22245394298949658229743820378048852284408073593060571728x901594842107607879256GA260.0222614981300931420088842"
或者
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 行)。
补充说明:
任何帮助将不胜感激!
谢谢你们!
最佳答案
你有几个选择。
首先,您可以使用带有内置 read.csv
的分隔符的 unicode 表示。它会正常工作:
read.csv("sample.csv", sep="\xfe", header=FALSE)
您也可以使用内置的
read.delim
具有相同的参数。哈德利的新品
readr
包还有read_delim
这有效,但它添加了一个 \r
到专栏V22
(什么是 X22
来自 read.csv
):library(readr)
read_delim("sample.csv", delim="\xfe", col_names=FALSE)
迅捷
fread
来自 data.table
也有效:library(data.table)
fread("sample.csv", sep="\xfe")
最后,您可以使用
strsplit
和 rbind.data.frame
:do.call(rbind.data.frame,
strsplit(readLines("sample.csv"), "\xfe", useBytes=TRUE, fixed=TRUE))
但是您需要设置正确的列名并在事后转换为可用类型。
关于r - 在 r 中解析 Thorn "þ"分隔的日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29604256/