如何在R

时间:2016-06-14 12:40:01

标签: r

我从事数据管理工作,这意味着人们会给我原始数据,我必须对其进行格式化和解析,以获得我需要的部分并以有意义的方式组织它。目前我使用的数据是一个日志文件,但我打开并将其保存为文本文件。看起来有点像这样:

  

M 20160525 09:51:11.822 DOC1:清除过期DENIED在39411ms后发送至1864130A.62274 13

     

D 20160525 09:51:11.824 F798257E获取10.19.100.24:62274 van8tc - " / pcgc / public / Other /" " *利"完成

     

M 20160525 09:51:11.825 DOC1:F798257E交易已于15804727确认

     

F 20160525 09:51:11.825 F798257E获取10.19.100.24:62274 van8tc - " / pcgc / public / Other /" " *利" 441(0,0)" 0.10秒(36.8千比特/秒)"    D 20160525 09:51:11.825 F798257E获取10.19.100.24:62274 van8tc - " / pcgc / public / Other /" " *利" - "解放包裹单位"

它是一个非常大的文件,我不希望将整个内容导入到R中,主要是因为它占用了大量的空间。每行都有"字段" (我想组织和分开的)指定如下:

  1. F - 行的标识符
  2. 20160525 - date(yyyymmdd)
  3. 17:52:38.791 - 时间戳(HH:MM:SS.sss)
  4. F798259D - 转移标识符
  5. 156.145.15.85:46634 - IP地址和相关端口
  6. xqixh8sl - 用户名
  7. AES - 加密级别(可以是 - (破折号))
  8. " / PCGC ... fastq.gz" - 转移文件(在")
  9. "" - 附加字符串(应该为空"")
  10. 2951144113 - 传输字节
  11. (0,0) - 错误
  12. " 2289.47秒(10.3兆比特/秒)" - 有关转移的数据
  13. 我需要的唯一行是以F开头且有(0,0)错误的行。这是一个示例行:

      

    F 20160525 17:52:38.791 F798259D GET 156.145.15.85:46634 xqixh8sl AES" /pcgc/public/Other/exome/fastq/PCGC0053681_HS_EX__1-02598__v1_FCAD18P7ACXX_L8_p92of93_P1.fastq.gz" "" 2951144113(0,0)" 2289.47秒(10.3兆比特/秒)"

    我不会考虑像这样的一行:

      

    F 20160602 14:15:48.398 F7982D62 GET 156.145.15.85:36773 xqixh8sl AES" /pcgc/public/Other/exome/fastq/PCGC0065109_HS_EX__1-04692__v3_FCAD2HMUACXX_L4_p1of1_P2.fastq.gz" "" 50725464(4,32)"远程应用程序:会话中止:由用户中断中止"

    上面的行没有(0,0)错误,因此不予考虑。

    我的问题是:由于文件太大,我希望能够通过它解析并只选择我需要的行。然后,一旦我导入它,我想要最好的方式来整理它。我知道有多种方法可以阅读该文件(我一直尝试使用readLines()scan())但我不知道如何在条件语句中写入(行必须以F开头,并且必须有(0,0)错误。

    我尝试过各种各样的事情:

    1. 使用scan()将整个文件作为列表导入R.

      x <- scan("dataSet.txt", what = list(lineID = "", date = "", timestamp = "", transferID = "", IP = "", username = "", encryption = "", transferredFile = "", error = "", data = ""), sep = " ", fill = TRUE, strip.white = TRUE)

      logs <- list(x)

      logs

    2. 虽然我喜欢编号和行,但它遗漏了我需要的很多字段。这是它给我的输出:

        

      [9062]&#34;&#34;
        [9063]&#34;&#34;
        [9064]&#34;&#34;
        [9065]&#34;&#34;
        [9066]&#34;&#34;
        [9067]&#34;&#34;
        [9068]&#34;&#34;
        [9069]&#34;&#34;
        [9070]&#34;&#34;
        [9071]&#34;&#34;
        [9072]&#34;&#34;
        [9073]&#34; Mnr:0&#34;
        [9074]&#34;&#34;
        [9075]&#34; Mnr:0&#34;
        [9076]&#34;&#34;
        [9077]&#34;&#34;
        [9078]&#34;数据&#34;
        [9079]&#34;&#34;
        [9080]&#34; 2,&#34;
        [9081]&#34; 12,&#34;
        [9082]&#34;&#34;
        [9083]&#34;&#34;
        [9084]&#34; 550F919C.60099&#34;

      1. 我在网上找到了这个例子,所以我复制了它并尝试使用它。但是,它没有给我我想要的东西。如果有人可以解释这是如何工作的,那也将非常感激。但是,我使用它的方式也导入了整个文件。
      2. > setwd("/Users/kimm5w/Intern Work")

        > dataset <- list()

        > con <- file("dataSet.txt")

        > open(con)

        > dataset <- grep("F", scan("dataSet.txt", what = list(lineID = "", date = "", timestamp = "", transferID = "", IP = "", username = "", encryption = "", transferredFile = "", error = "", data = ""), sep = " ", fill = TRUE, strip.white = TRUE), perl = TRUE, value = TRUE)

        > dataset

        这是它给我的输出,这不是我想要的格式:

        \"[0]\", \"\", \"xqixh8sl:\", \"\", \"\", \"\", \"\", \"Mnr:0\", \"\", \"Mnr:0\", \"\", \"\", \"data\", \"\", \"at\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"Mnr:0\", \"\", \"Mnr:0\", \"\", \"\", \"data\", \"\", \"at\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"Mnr:0\", \"\", \"Mnr:0\", \"\", \"\", \"data\", \"\", \"550F919C.36474\", \"\", \"550F919C.42385\", \"\", \"550F919C.49879\", \"\", \"550F919C.53923\", \"\", \"6,\", \"18,\", \"\", \"550F919C.36773\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"at\", \"\", \"\", \"\", \"\", \"\", \n\"\", \"\", \"550F919C.37525\", \"\", \"6,\", \"18,\", \"\")"

        我是R的新人;我学习了Java,虽然概念很相似,但语法却不熟悉。如果有人可以帮我这个,请做!我已经在这方面工作了大约一个星期而无法解决这个问题。谢谢你的帮助!

        更新

        这是我在完成你的建议后到目前为止所做的尝试:

            setwd("/Users/kimm5w/Intern Work")
            df<-data.frame(readLines("dataSet.txt"))
            F_dataSet <- grep("^F.*(0,0)", "dataSet.txt")
            F_dataSet
        
            library(stringr)
            x = 0
            while(x < length(readLines("dataSet.txt"))){
              line <- readLines("dataSet.txt")
              if (str_sub(line, 1, 1) == 'F' & grepl('\\(0\\,0\\)', line)[1]){
                F_data <- c(F_data, line)
                }
            }
            display(F_data)
        

        出于某种原因,当我尝试在R中运行它时,它不会显示结果。但是,它确实运行没有错误。我的问题是,其中一个是否有效。我无法使用for循环,因为确切的行数并不知道。所以相反,我尝试在第二个版本中使用while循环。该链接很有用,但有点令人困惑,因为我不熟悉语法。如果有人可以解释每个部分,我认为它会更容易理解。在第一次尝试时,我只是尝试使用grep()来排序我需要的行,但我不确定它是否有效。如果有人可以从这里帮忙,那将非常感激。那些给我答案的人,谢谢你。这对我帮助很大,而且是我一段时间以来取得的最大进步。

        这是另一个更新。它运行正常,但由于某种原因while循环不打印任何东西。当我尝试显示它时,F_data不会显示。有人可以指出错误在哪里吗?

            setwd("/Users/kimm5w/Intern Work")
            F_data <- data.frame
            print(F_data)
            library(stringr)
            x <- length(readLines("dataSet.txt"))
            print(x)
            while(x != 0)
              {
              line <- readline("dataSet.txt")
              print(line)
              if (str_sub(line, 1, 1) == 'F' & grepl('\\(0\\,0\\)', line)[1]){
                F_data <- c(F_data, line)
                print(F_data)
              }
              x <- x + 1
            }
            close(con)
            F_data
        

2 个答案:

答案 0 :(得分:0)

也许这是一个警察,但如果您担心在R会话期间保留记忆,请不要在R会话中执行此操作。您可以在将其读入R之前使用grep 对文件进行预处理。

grep "^F.*(0,0)" dataSet.txt > processed_dataSet.txt

答案 1 :(得分:0)

让我们说你读了第一行,使用readLines函数和for循环或其他东西。然后,您可以使用简单的搜索来查看您的行是否以&#34; F&#34;如果它包含&#34;(0,0)&#34;。例如:

library(stringr)
line='F 20160525 09:51:11.825 F798257E GET 10.19.100.24:62274 van8tc - "/pcgc/public/Other/" "*li" 441 (0,0) "0.10 seconds (36.8 kilobits/sec)" D 20160525 09:51:11.825 F798257E GET 10.19.100.24:62274 van8tc - "/pcgc/public/Other/" "*li" - "Freeing Package Unit"'

if(str_sub(line,1,1)=='F' & grepl('\\(0\\,0\\)', line)[1]){
    relevant_guys<-c(relevant_guys, line)
}

通过这种方式,您不必将整个文件放入内存中,并逐行评估。