File size: 3,262 Bytes
a1c0952
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import fs from 'node:fs';
import path from 'node:path';

import { getAndStreamCSVDataForId } from '../lib/ckan.js';
import { MachiAzaApi, SingleMachiAza } from '../data.js';
import { MachiAzaData, MachiAzaPosData } from '../lib/ckan_data/machi_aza.js';
import { mergeDataLeftJoin } from '../lib/ckan_data/index.js';
import { rawToMachiAza } from './02_machi_aza.js';
import { downloadAndExtractNlftpMlitFile, NlftpMlitDataRow } from '../lib/mlit_nlftp.js';
import { createMergedApiData, filterMlitDataByPrefCity } from '../lib/abr_mlit_merge_tools.js';

async function outputMachiAzaData(

  outDir: string,

  prefName: string,

  cityName: string,

  api: MachiAzaApi,

): Promise<number> {
  const outFile = path.join(outDir, 'ja', prefName, `${cityName}.json`);
  await fs.promises.mkdir(path.dirname(outFile), { recursive: true });
  await fs.promises.writeFile(outFile, JSON.stringify(api));
  console.log(`${prefName.padEnd(4, ' ')} ${cityName.padEnd(10, ' ')}: ${api.data.length.toString(10).padEnd(4, ' ')} 件の町字を出力した`);
  return api.data.length;
}

async function main(argv: string[]) {
  const updated = Math.floor(Date.now() / 1000);
  const outDir = argv[2] || path.join(import.meta.dirname, '..', '..', 'out', 'api');
  fs.mkdirSync(outDir, { recursive: true });


  const mainStream = getAndStreamCSVDataForId<MachiAzaData>('ba-o1-000000_g2-000003');
  const posStream = getAndStreamCSVDataForId<MachiAzaPosData>('ba000004');
  const rawData = mergeDataLeftJoin(mainStream, posStream, ['lg_code', 'machiaza_id']);
  // const rawData = mergeMachiAzaData(mainStream, posStream);

  let lastLGCode: string | undefined = undefined;
  let lastPrefName: string | undefined = undefined;
  let lastCityName: string | undefined = undefined;
  let lastMlitData: NlftpMlitDataRow[] | undefined = undefined;
  let allCount = 0;
  let apiData: SingleMachiAza[] = [];
  for await (const raw of rawData) {
    if (lastLGCode !== raw.lg_code && lastLGCode !== undefined) {
      const filteredMlit = filterMlitDataByPrefCity(lastMlitData!, lastPrefName!, lastCityName!);
      apiData = createMergedApiData(apiData, filteredMlit);
      const api: MachiAzaApi = { meta: { updated }, data: apiData };
      allCount += await outputMachiAzaData(outDir, lastPrefName!, lastCityName!, api);
      apiData = [];
    }
    if (lastPrefName !== raw.pref) {
      // 都道府県が変わったので、都道府県レベルの新しいデータを取得する
      lastMlitData = await downloadAndExtractNlftpMlitFile(raw.lg_code.slice(0, 2));
    }
    if (lastLGCode !== raw.lg_code) {
      lastLGCode = raw.lg_code;
      lastPrefName = raw.pref;
      lastCityName = `${raw.county}${raw.city}${raw.ward}`;
    }

    apiData.push(rawToMachiAza(raw));
  }
  if (lastLGCode) {
    const filteredMlit = filterMlitDataByPrefCity(lastMlitData!, lastPrefName!, lastCityName!);
    apiData = createMergedApiData(apiData, filteredMlit);
    const api: MachiAzaApi = { meta: { updated }, data: apiData };
    allCount += await outputMachiAzaData(outDir, lastPrefName!, lastCityName!, api);
  }

  console.log(`全国: ${allCount} 件の町字を出力した`);
}

export default main;