JavaScript提取.pre文件Grid-ref段数据并转DB表格式的方法
.pre文件数据转换为数据库表格式的实现方案
核心步骤拆解
- 提取目标数据段:从文件内容中截取第一个
Grid-ref到文件末尾的部分,忽略前面的元数据说明。 - 解析Grid-ref与对应数值组:将每个
Grid-ref及其下方的数值行分组,提取Xref、Yref坐标。 - 生成日期序列:从文件元数据中读取年份范围,为每个数值匹配对应的
YYYY-MM格式日期。 - 数值校准:结合
Multi因子转换原始数值,处理Missing缺失值。
完整JavaScript实现代码
const fs = require('fs'); // 读取.pre文件内容 const fileContent = fs.readFileSync('data.pre', 'utf8'); // 1. 提取元数据中的关键参数 const [startYear, endYear] = fileContent.match(/Years=(\d+)-(\d+)/).slice(1).map(Number); const multiFactor = parseFloat(fileContent.match(/Multi=\s*(\d+\.\d+)/)[1]); const missingValue = parseInt(fileContent.match(/Missing=(-?\d+)/)[1]); // 2. 提取从第一个Grid-ref到结尾的内容 const targetData = fileContent.match(/Grid-ref=.*$/s)[0]; // 3. 正则匹配每个Grid-ref块:捕获Xref、Yref、数值文本 const gridRegex = /Grid-ref=\s*(\d+),\s*(\d+)\n([\s\d]+)/g; let match; const result = []; while ((match = gridRegex.exec(targetData)) !== null) { const xref = parseInt(match[1]); const yref = parseInt(match[2]); // 拆分数值行:每行对应一年,每行12个数值对应1-12月 const valueLines = match[3].trim().split('\n').filter(line => line.trim() !== ''); // 遍历年份(每行对应一个年份) valueLines.forEach((line, yearIndex) => { const year = startYear + yearIndex; // 拆分该行的12个数值 const values = line.trim().split(/\s+/).map(numStr => { const num = parseInt(numStr); // 处理缺失值,转换为实际降水量 return num === missingValue ? null : num * multiFactor; }); // 遍历月份,生成每条记录 values.forEach((value, monthIndex) => { const month = monthIndex + 1; const date = `${year}-${month.toString().padStart(2, '0')}`; result.push({ Xref: xref, Yref: yref, Date: date, Value: value }); }); }); } // 此时result数组就是符合要求的数据库表格式数据,可直接用于Node.js数据库插入操作 console.log('转换完成,共生成', result.length, '条记录'); // 示例:输出前5条记录验证 console.log(result.slice(0, 5));
关键细节说明
- 正则匹配说明:
/Grid-ref=.*$/s:s修饰符让.匹配换行符,确保截取从第一个Grid-ref到文件末尾的所有内容。/Grid-ref=\s*(\d+),\s*(\d+)\n([\s\d]+)/g:全局匹配每个Grid-ref块,捕获坐标和后续的所有数值文本。
- 日期生成:通过年份索引计算对应年份,月份从1开始,用
padStart(2, '0')保证两位数格式(如01、02)。 - 数值处理:原始数值乘以
Multi因子(示例中为0.1)转换为实际降水量,缺失值(-999)转为null,可根据数据库需求调整为其他占位符。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

