簡體   English   中英

JSON 解析:去除R中的所有特殊字符?

[英]JSON Parsing: Removing All Special Characters in R?

我在 R 中有一個文件(“my_file”),看起來像這樣:

  NAME                                                                                                                                                                                     Address_Parse
1 name1 [('372', 'StreetNumber'), ('river', 'StreetName'), ('St', 'StreetType'), ('S', 'StreetDirection'), ('toronto', 'Municipality'), ('ON', 'Province'), ('A1C', 'PostalCode'), ('9R7', 'PostalCode')]
2 name2 [('208', 'StreetNumber'), ('ocean', 'StreetName'), ('St', 'StreetType'), ('E', 'StreetDirection'), ('Toronto', 'Municipality'), ('ON', 'Province'), ('J8N', 'PostalCode'), ('1G8', 'PostalCode')]

如果結構令人困惑,這里是文件的樣子

my_file = structure(list(NAME = c("name1", "name2"), Address_Parse = c("[('372', 'StreetNumber'), ('river', 'StreetName'), ('St', 'StreetType'), ('S', 'StreetDirection'), ('toronto', 'Municipality'), ('ON', 'Province'), ('A1C', 'PostalCode'), ('9R7', 'PostalCode')]", 
"[('208', 'StreetNumber'), ('ocean', 'StreetName'), ('St', 'StreetType'), ('E', 'StreetDirection'), ('Toronto', 'Municipality'), ('ON', 'Province'), ('J8N', 'PostalCode'), ('1G8', 'PostalCode')]"
)), class = "data.frame", row.names = c(NA, -2L))

在上一個問題( Parsing JSON in R: lexical error - invalid char in json text )中,我學習了如何使用以下代碼解析此文件中的 JSON 元素:

library(dplyr)
library(purrr)
library(stringr)
library(jsonlite)
library(tidyr)

my_file  %>% 
  mutate(Address_Parse = str_replace_all(Address_Parse,
      "\\(([^,]+),\\s*([^)]+)\\)", "\\2:\\1") %>% 
   str_replace(fixed("["), "[{") %>%
   str_replace(fixed("]"), "}]") %>%
   str_replace_all(fixed("'"), '"') %>% 
   map(fromJSON)) %>%
   unnest(Address_Parse) %>%
 type.convert(as.is = TRUE)

此代碼適用於我的一些數據集,但有時會產生以下錯誤:

Error: lexical error: inside a string, '\' occurs before a character which it may not.
          [["220", "StreetNumber"], ["O\x92Brien", "StreetName"], ["At
                     (right here) ------^

我試着查看有類似錯誤的帖子(例如詞法錯誤:在字符串中,'\' 出現在它可能不會出現的字符之前)。 檢查數據框本身時,似乎存在導致此問題的“特殊字符”(例如:Walker's)。 刪除此類特殊字符后,上面的 JSON 解析代碼似乎可以正常工作。

這讓我想到了我的問題:

  • 有沒有辦法以某種方式“強制”上述 JSON 解析代碼即使在遇到此類特殊字符時也能繼續?

  • 如果沒有辦法“強制”上面的 JSON 解析代碼,有沒有辦法刪除/替換 R 中的所有特殊字符? (例如用“A”代替“”?)

我查閱了以前的帖子(例如,從 R 中的字符串中刪除所有特殊字符? ),似乎沒有刪除所有特殊字符的通用方法 - 似乎必須單獨刪除特殊字符。 這似乎是一項乏味的任務,因為它可能涉及手動掃描數據以查找所有可能的特殊字符,然后將其刪除。

無論如何,有人可以建議如何處理這個問題嗎?

謝謝!

從示例中我可以猜測這些是 python 列表,而不是 JSON。所以我使用 package reticulate來評估 python 代碼(當然,評估任意代碼時需要小心):

my_file = structure(list(NAME = c("name1", "name2"), 
                         Address_Parse = c("[('372', 'StreetNumber'), ('river', 'StreetName'), ('St', 'StreetType'), ('S', 'StreetDirection'), ('toronto', 'Municipality'), ('ON', 'Province'), ('A1C', 'PostalCode'), ('9R7', 'PostalCode')]", 
"[('208', 'StreetNumber'), ('ocean', 'StreetName'), ('St', 'StreetType'), ('E', 'StreetDirection'), ('Toronto', 'Municipality'), ('ON', 'Province'), ('J8N', 'PostalCode'), ('1G8', 'PostalCode')]"
)), class = "data.frame", row.names = c(NA, -2L))

lst <- lapply(my_file$Address_Parse, reticulate::py_eval)
result <- do.call(rbind, lapply(lst, function(x) {
  xnames<-lapply(x, "[[", 2)
  xvalues<-lapply(x, "[[", 1)
  setNames(data.frame(xvalues),xnames)}))
result
#>   StreetNumber StreetName StreetType StreetDirection Municipality Province
#> 1          372      river         St               S      toronto       ON
#> 2          208      ocean         St               E      Toronto       ON
#>   PostalCode PostalCode
#> 1        A1C        9R7
#> 2        J8N        1G8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM