Vol.864 24.Feb.2023

ダブルクォテーション付きCSV (Pr-5)データ(CSV、JSON)

E Excelのチップス 〜ダブルクォテーション付きCSVデータとして保存

by fjk

 ExcelにCSVファイルを読み込むと、ダブルクォテーションが消されてしまう。そのため、データ修正後、再びダブルクォテーション付きCSVファイルとしては保存できず、他のソフトで使えないことがある。
 そこで、マクロでCSVファイルを作成する方法などが紹介されているが、「秀丸」などのテキストエディッタがあれば、簡単にダブルクォテーション付きファイルとして保存できる。
 さらに、この方法はExcelで必要なセル範囲のみのCSVファイルも作成できる。

  1. ダブルクォテーションを付けたい(例えばA)列の横に新しい(B)列を追加する
  2. (B列の)新規セルに、=""""&A2&"""" (データを4つのダブルクォテーションと&でくくる)としてコピー
  3. ダブルクォテーション付きデータとなるので、必要なセル分だけ、列方向へセルをコピーする
  4. 必要であれば、元のデータ列を「非表示」にする(コピーされないように)
  5. CSVデータにしたいエリアを選んでコピーし、秀丸エディタなどに貼り付ける(タブ区切り)
  6. エディタの「置換」で、検察:"\t"(タブ)、置換:","(カンマ)、「正規表現」をチェック
  7. 「全置換/クイック置換」を実行・・・(タブ区切り[TSV]ファイルのままで良ければ置換不要)
  8. ダブルクォテーションとカンマが付いたデータとなるので、CSVファイルとして保存

@AB 列B、Dを追加し
上記書式で隣にコピー

C CSVファイル化したいエリアをコピー
(数値もダブルクォテーション付きデータに)

D 秀丸エディタにコピー(タブ区切りデータ)
D−2
 タブ区切りデータで良いのなら
 そのままTSVファイルとして保存し、
 ここで、変換終了

EF タブをカンマに(クイック)全置換

G ダブルクォテーション+カンマ付きCSVに


P Processing (5)  〜データ(CSV、JSON)

by fjk

 Processinngでは行と列からなるExcelのような表形式のデータセットを扱うことが出来る。
 表形式データとして、@CSV(Comma-separated-values)、TSV(tab-separated-values)データをTableクラスの変数に、また、AJSONフォーマットデータをJSONObjectクラスのデータとして扱うことが出来る。
 新規に表を作ることも出来るが、ネットで入手できる表形式データを利用する例を紹介。

@ CSVデータ
CSVデータとして、気象庁の気象データをhttps://www.data.jma.go.jp/gmd/risk/obsdl/から取得
(「富山県の2022年度の月平均温度データ」を選択し、toyama2022.csvとして保存)
 ・ ファイルをプロジェクトのdataフォルダーに直接コピー
 ・ フルパスでファイル名を指定する
 ・ Web上のデータは、“http://・・・.jpg“等で指定
なお、jpeg写真データを扱う場合は、サイズが大きいので小さくしておくこと

気象庁の「気象データダウンロード」ページ

取得csvファイルをExcelで表示
Table stats;
void setup(){
  stats = loadTable("toyama2022.csv");
  for (int i=5; i < stats.getRowCount(); i++){
    String month= stats.getString(i,0);
    float tmp=stats.getFloat(i,1);
    println(month,tmp);
  }
}

(データが6行目からなのでi=5からスタート)

コンソールに読込データを表示
 loadTable(filename[,options])
   optionsは "header","tsv","csv","bin" が選択可

 Tableからのデータ取得は、typeに合わせて、
  整数型:    obj.getInt(row,colum)
  浮動小数点型: obj.getFloat(row,colum)
  文字列型:   obj.getString(row,colum)
  文字列配列型: obj.getStringColumn(colum)
 
※getRowCount()は読み込んだ行数(header行を除く)、getColumnCount()は列数を返す
※column番号の代わりにcolumnNameも使用可 (optionsに“header"を指定した時)
 
★前述の気象(温度)データを使って、グラフを作る
toyama2022.csvファイルをそのまま使い、前述の方法で個々のデータを取得しても良いが、Tableデータとして扱い易いように、先頭行をヘッダーのみに修正したファイル(toyama2022H.csv)をExcelで作成した

toyama2022H.csv
Table	tbl;
String[]	month;
float[] 	temp;
int		rowMax;

void setup(){
  size(480,180);
  tbl = loadTable("toyama2022H.csv","header");
  rowMax = tbl.getRowCount();
  month = new String[rowMax];
  temp  = new float[rowMax];
  for (int i=0; i < rowMax; i++){
    month[i] = tbl.getString(i,0);
    temp[i]  = tbl.getFloat(i,1);
    println(month[i],temp[i]);
  }
}
void draw(){
  background(120);
  textSize(16);
  stroke(255);
  strokeWeight(3);
  line(20,160,20,20);
  line(20,160,460,160);
  text("0",23,160);
  text("40",15,40);
  text("2022.1",40,180);
  text("2022.12",420,180);
  textSize(28);
  text("Temperatur(Toyama)",150,40);
  noFill();
  stroke(255,0,0);
  beginShape();
    for(int i=0; i < rowMax; i++){
      float x = map(i,0,rowMax-1,20,460);
      float y = map(temp[i],0,40,160,20);
      vertex(x,y);
    }
  endShape();
}

温度データグラフ
(富山、H2022)
【map関数】
 数値をある範囲から別の範囲に再マップする
map(value, start1, stop1, start2, stop2)
  value:変換したい数値
  start1〜stop1をstart2〜stop2に変換
A JSONデータ(JavaScript Object Notation)
 JSONデータとは、データ交換によく使われるフォーマットで、「キー」と「データ」をコロン「:」で区切って記述する書式で、キーおよび文字列データは必ずダブルクォーテーションでくくる必要がある(数値データはそのまま記述)。これらをカンマ「,」で連記するか、中括弧「{・・}」でくくると複数記述できる。データとしてオブジェクト({ })や配列([ ])も使用可能。
 身近なJSONファイルとして気象庁の「アメダスJSONファイル」は以下から取得できる。
 
  https://www.jma.go.jp/bosai/amedas/data/map/yyyyMMddHHmm00.json
   "yyyyMMddHHmm"には10分刻みの「年月日時分」+"00"で、過去1週間分程度のデータ取得が可能。
 
 データの最初の5桁の数値は「観測所番号」で、以下のページで確認できる、
  https://www.jma.go.jp/bosai/amedas/const/amedastable.json (富山は"55102")

アメダス観測所番号JSONデータの一部
(緯度、経度、標高、名前・・)

アメダスJSONデータの一部
 
(1)JSONデータの取得(指定したアメダス観測所の温度を取得する場合)
  1. JSONオブジェクト変数を準備 ・・・(今回は、事前にアメダスJSONファイルをダウンロード)
  2. loadJSONObject(file)関数でJSONデータ(joAmds)を読み込む(ネットワーク上ならfile=URL)
  3. getJSONObjectでJSONオブジェクト(joList)を取得
  4. getJSONArrayでJSON配列(jaTemp)を取得
  5. 配列の第1列をgetFloat(0)で温度データを取得
JSONObject joAme;
String FILE = "20230113123000.json";
String APOS = "11001";
void setup(){
  joAme = loadJSONObject(FILE);
  float temp = getTemp(APOS);
  println("AMEDAS(" + APOS + ") = " + temp);
}
float getTemp(String aPos){
  JSONObject joLst = joAme.getJSONObject(aPos);
  JSONArray  jaTmp = joLst.getJSONArray("temp");
  return jaTmp.getFloat(0);
}
「宗谷岬」(11001)の温度データ(5.6)を、get〜()メソッドで階層的に読込み、コンソールに表示
 
(2)アメダス観測所の緯度と経度、地名を取得
アメダス観測所データはJSONファイルでも取得できるが、JSONファイルでは観測所番号が取得できないので、
https://www.jma.go.jp/jma/kishou/know/amedas/ame_master.zipから取得
 ★アメダス観測所の緯度経度の範囲は、
   緯度:24.3.3(波照間)〜45.31.2(宗谷岬)、
   経度:123.46.0(波照間)〜153.59.0(南鳥島)
 入手後、観測所CSVデータを前述の方法で変換
 
(3)観測所の温度を地図化する
アメダスの温度データを、観測所の位置に
色を付けてプロット表示
(温度はHSBカラーで、青→赤で高温)。
 
アメダス観測所は全国に1,300箇所以上あるが、
JSONデータに観測所の温度データがある所
だけを色プロットした
(温度データが無い観測所は灰色表示)
String FILE1 = "ame_master_20221122X.csv";
String FILE2 = "20230113123000.json";
JSONObject joAme;
Table tbl;
int rowMax;
String aCode[], aName[];
float lat[], lon[];
void setup(){
  size(480,400);
  tbl 	= loadTable(FILE1,"header");
  joAme = loadJSONObject(FILE2);
  rowMax = tbl.getRowCount();
  aCode = new String[rowMax];
  aName	= new String[rowMax];
  lat 	= new float[rowMax];
  lon 	= new float[rowMax];
  for (int i=0; i < rowMax; i++){
    aCode[i] = tbl.getString(i,0);
    aName[i] = tbl.getString(i,1);
    lat[i]   = tbl.getFloat(i,2);
    lon[i]   = tbl.getFloat(i,3);
  }
  colorMode(HSB,360,100,100);
  strokeWeight(3);
}
void draw(){
  background(0,0,0);
  for(int i=0; i < rowMax; i++){
    print(aCode[i]+":");
    if(joAme.isNull(aCode[i]) != true){
      float temp = getTemp(aCode[i]);
      setXY(lat[i],lon[i],temp);
      println(temp);
    }
  }
  noLoop();
}
float getTemp(String aPos){
  JSONObject joLst = joAme.getJSONObject(aPos);
  if(joLst.isNull("temp") == true)   return -100;
  JSONArray jaTmp = joLst.getJSONArray("temp");
  return jaTmp.getFloat(0);
}
void setXY(float lat, float lon, float temp){
  float x = map(lon,122,154,10,470);
  float y = map(lat,24,46,390,10);
  float col = map(temp,-5,25,240,0);
  if(temp > -90) stroke(col,100,100); // HSBcolor
    else         stroke(0,0,50);      // HSB gray
  point(x,y);
}
(参考データ)
ame_master_20221122X.csv
20230113123000.json

日本全国アメダス温度マップ
(青→赤で高温)


【参考】 主なアメダス・気象データの取得先
※ 「station」は5桁の観測所番号。ex:"55102"
※ {yyyyMMddHHmm}は年月日時分(最小10分刻み)。ex:"202301011230"
※ {d3}は時刻(ex:"00"、"03"、・・、"21"、と3時間おき)
※ (pathCode)はエリア(地域)のコード
(AMeDAS: Automated Meteorological Data Acquisition System 自動気象データ収集システム)
※ これらのデータは公式に発表されたものではないので、変わる可能性があります。


※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。


ダブルクォテーション付きCSV (Pr-5)データ(CSV、JSON)