项目迁移
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
import { readFile, writeFile } from 'node:fs/promises';
|
||||
import { resolve } from 'node:path';
|
||||
|
||||
const input = resolve(process.argv[2] || 'ok_data_level3.csv');
|
||||
const output = resolve(process.argv[3] || 'src/data/china-regions.mjs');
|
||||
|
||||
function parseCsvLine(line) {
|
||||
const values = [];
|
||||
let value = '';
|
||||
let quoted = false;
|
||||
for (let index = 0; index < line.length; index += 1) {
|
||||
const char = line[index];
|
||||
if (char === '"') {
|
||||
if (quoted && line[index + 1] === '"') { value += '"'; index += 1; }
|
||||
else quoted = !quoted;
|
||||
} else if (char === ',' && !quoted) {
|
||||
values.push(value);
|
||||
value = '';
|
||||
} else value += char;
|
||||
}
|
||||
values.push(value);
|
||||
return values;
|
||||
}
|
||||
|
||||
const source = await readFile(input, 'utf8');
|
||||
const rows = source.replace(/^\uFEFF/, '').trim().split(/\r?\n/).slice(1).map(line => {
|
||||
const [id, pid, deep, , , , extId, extName] = parseCsvLine(line);
|
||||
return { id, pid, deep: Number(deep), code: extId.slice(0, 6), name: extName };
|
||||
});
|
||||
|
||||
const provinces = rows.filter(item => item.deep === 0 && item.code !== '0').map(province => ({
|
||||
code: province.code,
|
||||
name: province.name,
|
||||
cities: rows.filter(city => city.deep === 1 && city.pid === province.id).map(city => ({
|
||||
code: city.code,
|
||||
name: city.name,
|
||||
districts: rows.filter(district => district.deep === 2 && district.pid === city.id).map(district => ({
|
||||
code: district.code,
|
||||
name: district.name
|
||||
}))
|
||||
}))
|
||||
}));
|
||||
|
||||
const hotan = provinces.find(item => item.code === '650000')?.cities.find(item => item.code === '653200');
|
||||
for (const district of [
|
||||
{ code: '653228', name: '和康县' },
|
||||
{ code: '653229', name: '和安县' }
|
||||
]) {
|
||||
if (hotan && !hotan.districts.some(item => item.code === district.code)) hotan.districts.push(district);
|
||||
}
|
||||
hotan?.districts.sort((a, b) => a.code.localeCompare(b.code));
|
||||
|
||||
const banner = `// Generated from AreaCity-JsSpider-StatsGov release 2025.251231.260403.\n// Source snapshot: 国家地名信息库 2025-12-31; generated 2026-07-20.\n// Manual official additions: 和康县 653228, 和安县 653229.\n`;
|
||||
await writeFile(output, `${banner}export const chinaRegionsVersion = '2025-12-31';\nexport const chinaRegions = ${JSON.stringify(provinces)};\n`, 'utf8');
|
||||
console.log(`Generated ${provinces.length} provinces at ${output}`);
|
||||
Reference in New Issue
Block a user