【问题标题】:Instructing R to find variable name in rows when reading csv file读取csv文件时指示R在行中查找变量名
【发布时间】:2015-10-24 02:49:44
【问题描述】:

有没有办法让 R 在读取 csv 文件时读取每个单元格中的列/变量名?

我的 csv 文件格式错误。并非每一行都有每个变量,也不是每一行都具有相同的长度。但是,每一行都有一个变量名,例如"id": "37189", "city": "Phoenix", "type": "business"。当我告诉 R 读取 csv 时,我可以指示它在数据中查找变量名并进行相应排序吗?

为您提供方便的数据示例:

business_id:vcNAWiLM4dR7D2nwwJ7nCA,full_address:4840 E Indian School Rd\nSte 101\nPhoenix, AZ 85018,关闭:17:00,打开:08:00,打开:true,类别:[医生, Health & Medical],城市:Phoenix,review_count:9,姓名:Eric Goldberg, MD,社区:[],经度:-111.98375799999999,州:AZ,星星:3.5,纬度:33.499313000000001,属性:预约仅:真,类型:商务,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,

business_id:UsFtqoBl7naz8AVUBZMjQQ,完整地址:202 McClure St\nDravosburg, PA 15034,营业时间:true,类别:[夜生活],城市:Dravosburg,review_count:4,名称:Clancy's Pub,街区:[],经度:-79.886930000000007 ,州:PA,星数:3.5,纬度:40.350518999999998,属性:欢乐时光:真,接受信用卡:真,适合团体:真,户外座位:假,价格范围:1,类型: 商业,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,

business_id: cE27W9VPgO88Qxe4ol6y_g,{ full_address: 1530 Hamilton Rd\nBethel Park, PA 15234}, open: false, 类别: [Active Life, Mini Golf, Golf], 城市: Bethel Park, review_count: 5, name: Cool Springs高尔夫中心,街区:[],经度:-80.015910000000005,州:PA,星数:2.5,纬度:40.356896200000001,属性:适合儿童:true,类型:商业,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,

粗体字是一些没有出现在其他条目中的变量。

【问题讨论】:

  • 你确定是csv格式吗?它看起来像 json 或类似的东西。
  • 我同意 hfty。一些邪恶的人拿走了 JSON,删除了括号并将其推入 CSV 文件的字段 1。有没有办法回到这个文件的来源并要求创建者只给你JSON?处理(99% 最有可能)attributes 没有 括号中的嵌套结构将涉及一些有趣的解析/处理。
  • 我知道我认出了这一点。您是如何将完美的 Yelp API JSON 转换为这种格式的?
  • @hrbrmstr 哦,这很有道理——我对 JSON 一无所知,但这个文件太乱了,它不应该是 cvs 是有道理的。谢谢。

标签: r csv


【解决方案1】:

这会让你开始,但你还有很多工作要做。这适用于一行(在示例中它可能适用于其他两行),但可以推断它适用于所有行(lapply FTW)。基本上,您需要从该单个字段重建 JSON 结构(可能有其他方法,特别是如果您不需要所有字段)。因为 Yelp 模式是已知的,所以它比其他方式更容易。

您必须以非常确定的方式对其进行攻击,在其他字段之前转换某些字段,在字段名称中考虑空格,处理数组和嵌套结构等。正如我所说,您还有很多工作要做.如果你的正则表达式很弱,这将为成为正则表达式忍者提供充足的练习。

library(stringi)
library(stringr)
library(jsonlite)

txt <- 'business_id: vcNAWiLM4dR7D2nwwJ7nCA, full_address: 4840 E Indian School Rd\nSte 101\nPhoenix, AZ 85018, close: 17:00, open: 08:00, open: true, categories: [Doctors, Health & Medical], city: Phoenix, review_count: 9, name: Eric Goldberg, MD, neighborhoods: [], longitude: -111.98375799999999, state: AZ, stars: 3.5, latitude: 33.499313000000001, attributes: By Appointment Only: true, type: business'
txt <- gsub("\n", "|", txt)

txt <- sub("business_id: ([[:alnum:]\\:]+)", '"business_id": "\\1"', txt)

txt <- sub('attributes: ', '"attributes": {', txt)
txt <- sub('By Appointment Only: ', '"By Appointment Only": ', txt)
txt <- sub('Accepts Credit Cards: ', '"Accepts Credit Cards": ', txt)
txt <- sub('Good For Groups: ', '"Good For Groups": ', txt)
txt <- sub('Outdoor Seating: ', '"Outdoor Seating": ', txt)
txt <- sub('Price Range: ', '"Price Ranges": ', txt)

txt <- sub("full_address: ([[:alnum:][:space:],\\|\\-\\.]+), close:", '"full_address": "\\1", close:', txt)
txt <- sub("full_address: ([[:alnum:][:space:],\\|\\-\\.]+), open:",  '"full_address": "\\1", open:', txt)

txt <- sub("name: (.*), neighborhoods:", '"name": "\\1", "neighborhoods":', txt)

txt <- gsub("open: ([[:alnum:]\\:]+)", '"open": "\\1"', txt)
txt <- sub("close: ([[:alnum:]\\:]+)", '"close": "\\1"', txt)

txt <- sub("longitude: ([[:digit:]\\.-]+)", '"longitude": "\\1"', txt)
txt <- sub("latitude: ([[:digit:]\\.-]+)", '"latitude": "\\1"', txt)

txt <- sub("review_count: ([[:digit:]\\.]+)", '"review_count": "\\1"', txt)
txt <- sub("stars: ([[:digit:]\\.]+)", '"stars": "\\1"', txt)
txt <- sub("state: ([[:alpha:]]+)", '"state": "\\1"', txt)
txt <- sub("city: ([[:alpha:] \\.-]+)", '"city": "\\1"', txt)

txt <- sub("type: ([[:alpha:]]+)", '"type": "\\1"', txt)

cats <- paste0(sprintf('"%s"', str_trim(str_split(str_match_all(txt, "categories: \\[([[:alpha:] &-,]+)\\],")[[1]][,2], ",")[[1]])), collapse=", ")
txt <- sub("categories: \\[([[:alpha:] &-,]+)\\],", '"categories": [' %s+% cats %s+% '],', txt)

txt <- "{" %s+% txt %s+% "}}"

fromJSON(txt)
## $business_id
## [1] "vcNAWiLM4dR7D2nwwJ7nCA"
## 
## $full_address
## [1] "4840 E Indian School Rd|Ste 101|Phoenix, AZ 85018"
## 
## $close
## [1] "17:00"
## 
## $open
## [1] "08:00"
## 
## $open
## [1] "true"
## 
## $categories
## [1] "Doctors"          "Health & Medical"
## 
## $city
## [1] "Phoenix"
## 
## $review_count
## [1] "9"
## 
## $name
## [1] "Eric Goldberg, MD"
## 
## $neighborhoods
## list()
## 
## $longitude
## [1] "-111.98375799999999"
## 
## $state
## [1] "AZ"
## 
## $stars
## [1] "3.5"
## 
## $latitude
## [1] "33.499313000000001"
## 
## $attributes
## $attributes$`By Appointment Only`
## [1] TRUE
## 
## $attributes$type
## [1] "business"

而且,无论是谁给了你这个文件,他们的程序生活中遇到的任何邪恶都是值得的。我会用带有 EBCDIC 编码的粗糙 XML 将他们想要的任何东西还给他们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2013-08-28
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多