You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript提取.pre文件Grid-ref段数据并转DB表格式的方法

.pre文件数据转换为数据库表格式的实现方案

核心步骤拆解

  1. 提取目标数据段:从文件内容中截取第一个Grid-ref到文件末尾的部分,忽略前面的元数据说明。
  2. 解析Grid-ref与对应数值组:将每个Grid-ref及其下方的数值行分组,提取Xref、Yref坐标。
  3. 生成日期序列:从文件元数据中读取年份范围,为每个数值匹配对应的YYYY-MM格式日期。
  4. 数值校准:结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:20:47