Импорт данных типа JSON из текстового файла - PullRequest
0 голосов
/ 29 сентября 2018

Мне дали текстовый файл со следующими типами данных json:

{"interviews":{
"4582058":{"date":24oct2015,"status":completed},
"2045873":{"date":12nov2015,"status":unclear},
"5969361":{"date":19dec2015,"status":pending},
"4969210":{"date":7jan2016,"status":completed}}}

У меня есть следующие идентификаторы, для каждого из которых я хотел бы импортировать данные:

0234, 6232, 6953, 9586, 4198

Как я могу сделать это в Stata 14?

1 Ответ

0 голосов
/ 29 сентября 2018

Сначала вам нужно ввести идентификаторы в Stata и сохранить их в файле dta:

clear

input id
0234
6232
6953
9586
4198
end

list

     +------+
     |   id |
     |------|
  1. |  234 |
  2. | 6232 |
  3. | 6953 |
  4. | 9586 |
  5. | 4198 |
     +------+

save identifiers, replace

Предполагая, что данные типа json сохраняются в файле с именем interviews.txt, вы можете импортироватьв строковую переменную, используя команду import delimited:

import delimited interviews.txt, rowrange(2) delimiter("},", asstring) clear
drop v2

list

     +-------------------------------------------------+
     |                                              v1 |
     |-------------------------------------------------|
  1. |   4582058":{"date":24oct2015,"status":completed |
  2. |     2045873":{"date":12nov2015,"status":unclear |
  3. |     5969361":{"date":19dec2015,"status":pending |
  4. | 4969210":{"date":7jan2016,"status":completed}}} |
     +-------------------------------------------------+

Затем вы можете использовать комбинацию строковых функций , чтобы извлечь информацию в отдельных переменных:

generate interview = substr(v1, 1, strpos(v1, ":") - 2)
generate date = substr(v1, ustrrpos(v1, ":", 25) + 1, strpos(v1, ",") - ustrrpos(v1, ":", 25) - 1)
generate status = subinstr(substr(v1, strrpos(v1, ":") + 1, .), "}", "", .)

list, abbreviate(10)

     +-------------------------------------------------------------------------------------+
     |                                              v1   interview        date      status |
     |-------------------------------------------------------------------------------------|
  1. |   4582058":{"date":24oct2015,"status":completed     4582058   24oct2015   completed |
  2. |     2045873":{"date":12nov2015,"status":unclear     2045873   12nov2015     unclear |
  3. |     5969361":{"date":19dec2015,"status":pending     5969361   19dec2015     pending |
  4. | 4969210":{"date":7jan2016,"status":completed}}}     4969210    7jan2016   completed |
     +-------------------------------------------------------------------------------------+

drop v1

Этот подход прост и позволяет переменному содержимому id, date и status иметь различную длину.

После завершения этих шагов вы можете использовать crossКоманда для получения желаемого результата:

cross using identifiers

order id
sort id interview

list, abbreviate(10) sepby(id)

     +------------------------------------------+
     |   id   interview        date      status |
     |------------------------------------------|
  1. |  234     2045873   12nov2015     unclear |
  2. |  234     4582058   24oct2015   completed |
  3. |  234     4969210    7jan2016   completed |
  4. |  234     5969361   19dec2015     pending |
     |------------------------------------------|
  5. | 4198     2045873   12nov2015     unclear |
  6. | 4198     4582058   24oct2015   completed |
  7. | 4198     4969210    7jan2016   completed |
  8. | 4198     5969361   19dec2015     pending |
     |------------------------------------------|
  9. | 6232     2045873   12nov2015     unclear |
 10. | 6232     4582058   24oct2015   completed |
 11. | 6232     4969210    7jan2016   completed |
 12. | 6232     5969361   19dec2015     pending |
     |------------------------------------------|
 13. | 6953     2045873   12nov2015     unclear |
 14. | 6953     4582058   24oct2015   completed |
 15. | 6953     4969210    7jan2016   completed |
 16. | 6953     5969361   19dec2015     pending |
     |------------------------------------------|
 17. | 9586     2045873   12nov2015     unclear |
 18. | 9586     4582058   24oct2015   completed |
 19. | 9586     4969210    7jan2016   completed |
 20. | 9586     5969361   19dec2015     pending |
     +------------------------------------------+
...