在r中解析Thorn"þ"分隔的日志文件

Yev*_*ach 4 r

我正在尝试读取由分隔的csv文件(最初更改扩展名的日志文件).

无论如何简单readLinesread.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"
Run Code Online (Sandbox Code Playgroud)

现在我试图解析它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"
Run Code Online (Sandbox Code Playgroud)

或者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"
Run Code Online (Sandbox Code Playgroud)

然后运行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"
Run Code Online (Sandbox Code Playgroud)

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

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

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

我添加此链接是因为我害怕使用来自网站的复制粘贴只会产生我得到的最终结果,所以为了重现问题,必须下载文件(这只是这5行).

补充说明:

  1. 我正在使用Windows机器.

  2. Excel工具"text to columns"成功解析了这个,但是我有多个文件太大而无法处理excel,我希望在r中继续我的分析.

任何帮助将非常感谢!多谢你们!

hrb*_*str 7

你有几个选择.

首先,您可以使用内置的分隔符的unicode表示,read.csv它将正常工作:

read.csv("sample.csv", sep="\xfe", header=FALSE)
Run Code Online (Sandbox Code Playgroud)

您也可以使用内置read.delim相同的参数.

Hadley的新readr软件包也有一个read_delim可行,但是它添加了一个\rV22(X22来自read.csv):

library(readr)
read_delim("sample.csv", delim="\xfe", col_names=FALSE)
Run Code Online (Sandbox Code Playgroud)

迅速freaddata.table也可以工作:

library(data.table)
fread("sample.csv", sep="\xfe")
Run Code Online (Sandbox Code Playgroud)

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

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

但是你需要设置正确的列名并在事后转换为可用的类型.