😀

直近一週間の日本地震XMLをjqで処理してCSVにする

2021/09/28に公開

何?

NHKの地震情報API(XML形式)をjqでCSVに変換し書き出す.
スクリプト言語で書くよりコマンドラインでjqを使うとシュッと終わるのでおすすめ.
書き出したCSVはExcelで処理するなりPythonに食わせるなりできる.

API

素のままだとShift-JISなので扱いやすいUTF-8に変換する.

$ curl -s https://www3.nhk.or.jp/sokuho/jishin/data/JishinReport.xml \
  | iconv -f sjis -t utf8
JishinReport.xml
<?xml version="1.0" encoding="UTF-8"?>
<jishinReport>
   <record date="2021年02月28日">
      <item time="13時14分ごろ" shindo="1" url="https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210228131405_20210228131703.xml">千葉県東方沖</item>
      <item time="11時20分ごろ" shindo="2" url="https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210228112012_20210228112403.xml">大阪府北部</item>
      <item time="09時40分ごろ" shindo="2" url="https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210228094024_20210228094308.xml">島根県東部</item>
   </record>
...(省略)...
   <record date="2021年02月22日">
      <item time="11時57分ごろ" shindo="3" url="https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210222115717_20210222120040.xml">和歌山県北部</item>
      <item time="11時23分ごろ" shindo="1" url="https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210222112327_20210222112619.xml">福島県沖</item>
      <item time="10時56分ごろ" shindo="3" url="https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210222105604_20210222110001.xml">根室半島南東沖</item>
   </record>
</jishinReport>

CSVにする

xqの導入

まずXMLをJSONパーサであるjqで扱うには、jqのXMLラッパーxqを用いる.
xqはYAMLラッパーであるyqに含まれる.

# インストール
$ pip install yq

パース

各カラムはdate,time,place,shindo,datasource
jqは各データを[head1, ..., h5], [[col1, ..., c5], [c1, ..., c5], ...][]|@csvとするとヘッダ付きCSVを書き出せる.

$ curl -s https://www3.nhk.or.jp/sokuho/jishin/data/JishinReport.xml \
  | iconv -f sjis -t utf8 \
  | xq -r '
    [
      "date",
      "time",
      "place",
      "shindo",
      "datasource"
    ],
    (
      [                     
        .jishinReport.record[]
        | ."@date" as $i | .item
        | if type=="object" then [.] else . end
        | map(.+={"@date":$i})[]
        | [
          ."@date",
          ."@time",
          ."#text",
          "震度"+."@shindo",
          ."@url"
        ]
      ] | reverse
    )[] | @csv'  > res.csv
res.csv
"date","time","place","shindo","datasource"
"2021年02月22日","10時56分ごろ","根室半島南東沖","震度3","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210222105604_20210222110001.xml"
"2021年02月22日","11時23分ごろ","福島県沖","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210222112327_20210222112619.xml"
"2021年02月22日","11時57分ごろ","和歌山県北部","震度3","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210222115717_20210222120040.xml"
"2021年02月23日","04時42分ごろ","茨城県北部","震度2","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210223044248_20210223044539.xml"
"2021年02月23日","06時22分ごろ","福島県沖","震度2","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210223062244_20210223062534.xml"
"2021年02月23日","06時40分ごろ","福島県沖","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210223064051_20210223064339.xml"
"2021年02月23日","07時05分ごろ","長野県北部","震度2","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210223070550_20210223070820.xml"
"2021年02月23日","09時36分ごろ","紀伊水道","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210223093601_20210223093846.xml"
"2021年02月23日","09時52分ごろ","福島県沖","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210223095217_20210223095523.xml"
"2021年02月23日","16時09分ごろ","伊予灘","震度3","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210223160907_20210223161234.xml"
"2021年02月24日","00時56分ごろ","茨城県南部","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210224005613_20210224005907.xml"
"2021年02月24日","02時39分ごろ","福島県沖","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210224023905_20210224024140.xml"
"2021年02月24日","08時35分ごろ","鹿児島県薩摩地方","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210224083552_20210224083907.xml"
"2021年02月24日","09時54分ごろ","千葉県南部","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210224095431_20210224095703.xml"
"2021年02月25日","01時12分ごろ","広島県北部","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210225011229_20210225011523.xml"
"2021年02月25日","07時26分ごろ","択捉島付近","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210225072646_20210225073009.xml"
"2021年02月25日","15時55分ごろ","熊本県熊本地方","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210225155514_20210225155813.xml"
"2021年02月25日","19時18分ごろ","千葉県北東部","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210225191851_20210225192120.xml"
"2021年02月25日","22時57分ごろ","和歌山県北部","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210225225753_20210225230139.xml"
"2021年02月26日","04時45分ごろ","秋田県沖","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210226044543_20210226044843.xml"
"2021年02月26日","07時13分ごろ","福島県沖","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210226071317_20210226071639.xml"
"2021年02月26日","10時16分ごろ","和歌山県北部","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210226101617_20210226101925.xml"
"2021年02月26日","13時04分ごろ","福島県沖","震度2","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210226130433_20210226130732.xml"
"2021年02月26日","14時03分ごろ","福島県沖","震度2","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210226140313_20210226140553.xml"
"2021年02月26日","18時42分ごろ","大分県中部","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210226184229_20210226184543.xml"
"2021年02月26日","19時18分ごろ","福島県沖","震度2","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210226191838_20210226192148.xml"
"2021年02月26日","20時31分ごろ","青森県東方沖","震度3","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210226203145_20210226203448.xml"
"2021年02月27日","00時33分ごろ","福島県沖","震度3","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210227003337_20210227003720.xml"
"2021年02月27日","02時04分ごろ","福島県沖","震度3","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210227020358_20210227020800.xml"
"2021年02月27日","05時48分ごろ","トカラ列島近海","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210227054846_20210227055307.xml"
"2021年02月27日","06時01分ごろ","トカラ列島近海","震度3","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210227060107_20210227060456.xml"
"2021年02月27日","06時12分ごろ","トカラ列島近海","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210227061230_20210227061618.xml"
"2021年02月27日","10時37分ごろ","埼玉県南部","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210227103729_20210227104020.xml"
"2021年02月28日","09時40分ごろ","島根県東部","震度2","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210228094024_20210228094308.xml"
"2021年02月28日","11時20分ごろ","大阪府北部","震度2","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210228112012_20210228112403.xml"
"2021年02月28日","13時14分ごろ","千葉県東方沖","震度1","https://www3.nhk.or.jp/sokuho/jishin/data/JSA0210228131405_20210228131703.xml"

結論

お手軽

GitHubで編集を提案

Discussion