【问题标题】:How to parse a complicated csv file in R?如何在 R 中解析复杂的 csv 文件?
【发布时间】:2019-10-17 11:32:33
【问题描述】:

我一直在努力解析一个复杂的 *.csv 文件,如下所示。它有 6 行,但是,所有列标题、ID、字段值都列在用逗号分隔的单行中。大多数标题都有空格和单位“(in)”,需要按原样使用。

示例文件:

    Version,1.1,1198    
    Dimension Unit,in,1000.000000
    Angle Unit,°,17.095780
    Measurement Names,Body height (in),Head height (in),Neck height (mm),Distance neck to buttock (in),Distance neck-knee (in)
    Measurement IDs,0010,0020,0030,0040,0050
    C:\Data\new.csv,796,,398,212

我想要的是:

  1. 跳过前 3 行
  2. 用标题制作 3 列:
    • “测量名称”(取自第 4 行),
    • “测量 ID”(取自第 5 行)和
    • “C:\Data\new.csv”(最后一行)
  3. 用逗号分隔所有字段并将它们转置到右列中
  4. 处理一些空字段值

正确解析后应该是这样排列的:

    Measurement Names             Measurement IDs  C:\Data\new.csv 
    Body height (in)              0010             796  
    Head height (in)              0020
    Neck height (in)              0030             398
    Distance neck to buttock (in) 0040             212
    Distance neck-knee (in)       0050                  

我尝试过 read.csv、read.table 但唯一成功读取的是 readLines。但是,即使给出了这个选项,它也没有跳过前 3 行。此外,什么编码也没关系。 假设

data <- "C:\\Temp\\test.csv"
filename <- file(data,open="r")

Zeile <-readLines(filename,
                  skip=3,
                  #warn=FALSE,
                  encoding = 'utf-16-be'
                  )
Zeile <- strsplit(Zeile, ",") # here I try to split 
for (i in 1:length(Zeile)){
  print(Zeile[i])
}
close(filename)

结果如下所示:

[[1]]
[1] "Version" "1.1"     "1198\t"  

[[1]]
[1] "Length Unit" "mm"          "1000.000000"

[[1]]
[1] "Angle Unit" "°"         "57.295780" 

[[1]]
[1] "Measurement Names"             "Body height (mm)"              "Head height (mm)"             
[4] "Neck height (mm)"              "Distance neck to buttock (mm)" "Distance neck-knee (mm)"      

[[1]]
[1] "Measurement IDs" "0010"            "0020"            "0030"            "0040"           
[6] "0050"           

[[1]]
[1] "C:\\Data\\new.csv" "796"               ""                  "398"               "212"              

[[1]]
character(0)

有引号,并且字段值未在正确的列下对齐。

如何将预期结果放入数据框中以进行进一步处理?

【问题讨论】:

    标签: r csv


    【解决方案1】:

    你可以试试这个:

    library(tidyverse)
    read.csv("path/your_file.csv", sep = ",", skip = 3, colClasses = "character") %>% 
       gather(Measurement_Names, v, -Measurement.Names) %>% 
       spread(Measurement.Names, v)
                 Measurement_Names  C:\\Data\\new.csv Measurement IDs
    1              Body.height..mm.               796            0010
    2       Distance.neck.knee..mm.                              0050
    3 Distance.neck.to.buttock..mm.               212            0040
    4              Head.height..mm.                              0020
    5              Neck.height..mm.               398            0030
    

    【讨论】:

    • 为了完整起见,使用库tidyr
    • @R.S.只是忘记包含所需的软件包。谢谢
    • 感谢它的魅力。 %>% 在该代码中做了什么?
    【解决方案2】:

    它不是 R,但我认为它可能有用。我正在使用 Miller (https://github.com/johnkerl/miller) 和 csvtk (https://bioinf.shenwei.me/csvtk/)。

    跑步

    tail -n +4 input_01.csv | mlr --nidx --fs "," cat -n  then unsparsify | csvtk transpose | tail -n +2
    

    你会有

    Measurement Names,Measurement IDs,C:\Data\new.csv
    Body height (mm),0010,796
    Head height (mm),0020,
    Neck height (mm),0030,398
    Distance neck to buttock (mm),0040,212
    Distance neck-knee (mm),0050,
    

    或者漂亮的打印运行

    tail -n +4 input_01.csv | mlr --nidx --fs "," cat -n  then unsparsify | csvtk transpose | tail -n +2 | mlr --c2p cat
    

    拥有

    Measurement Names             Measurement IDs C:\Data\new.csv
    Body height (mm)              0010            796
    Head height (mm)              0020            -
    Neck height (mm)              0030            398
    Distance neck to buttock (mm) 0040            212
    Distance neck-knee (mm)       0050            -
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多