2015-10-24 2 views
0

Есть ли способ, чтобы R считывал имя столбца/переменной в каждой ячейке при чтении файла csv?Поручить 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, Категории: [Доктора, Здоровье & Medical], город: Phoenix, review_count: 9, имя: Эрик Голдберг, MD, окрестности: [], долгота: -111.98375799999999, штат: AZ, stars: 3.5, широта: 33.499313000000001 , атрибуты: Только по назначению: true, тип: business ,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

business_id: UsFtqoBl7naz8AVUBZMjQQ, full_address: 202 McClure St \ nDravosburg, PA 15034, open :, категории: [Ночная жизнь], город: Dravosburg, review_count: 4, имя: Clancy's Pub, окрестности: [], долгота: -79.886930000000007 , состояние: PA, звезды: 3.5, широта: 40.350518999999998, атрибуты: Happy Hour: true, принимает кредитные карты: правда, хорошо для групп: правда, на улице Сиденья: ложные, Диапазон цен: 1, тип: business ,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,

business_id: cE27W9VPgO88Qxe4ol6y_g, {full_address: 1530 Hamilton Rd \ nBethel Park, PA 15234}, open: false, categories: [Active Life , Mini Golf, Golf], город: Bethel Park, review_count: 5, имя: Центр здоровья Спрингс, окрестности: [], долгота: -8 0.015910000000005, штат: PA, stars: 2.5, широта: 40.356896200000001, атрибуты: Хорошо для детей: true, type: business ,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

Жирным шрифтом являются некоторые из переменных, которые не отображаются в других записях.

+0

Вы уверены, что это формат csv? Это похоже на json или что-то подобное. – cocquemas

+0

Я согласен с hfty. какой-то злой человек взял JSON, удалил скобки и перебросил его в поле 1 файла CSV.нет ли способа вернуться к источнику этого файла и попросить создателя просто дать вам JSON? имея в виду (что, скорее всего, 99%), вложенная структура в 'attributes' _woutout-скобки будет включать в себя некоторые интересные синтаксические разборки/munging. – hrbrmstr

+0

Я знал, что узнал это. как вы получили превосходный Yelp API JSON в этом формате? – hrbrmstr

ответ

1

Это даст вам начато, но у вас все еще есть довольно много работы. Это работает для одной строки (и это может работать для двух других в примере), но ее можно экстраполировать для работы со всеми линиями (FTW). В основном вам нужно перестроить структуру JSON из этого единственного поля (могут быть альтернативные способы, особенно если вам не нужны все поля). Это проще, чем могло бы быть иначе, так как известна схема Yelp.

Вы должны атаковать его довольно детерминированным способом, преобразовывая некоторые поля перед другими, составляя пробелы в именах полей, имея дело с массивами & вложенными структурами и т. Д. Как я уже сказал, у вас довольно много работы впереди вы. Если ваше регулярное выражение fu слабое, это обеспечит достаточную практику, чтобы стать ниндзя регулярного выражения.

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" 

И кто бы ни дал вам этот файл, заслуживает того, что зло приходит в их программной жизни. Я бы отдал им все, что захотел, из gnarly XML с кодировкой EBCDIC.

Смежные вопросы