【Linux、C】生成测试数据json、xml、csv文件

CLogFile类:  日志类
CFile类:        文件类
CCmdStr类: 字符串分割类

/*
 *  程序名:crtsurfdata5.cpp  本程序用于生成全国气象站点观测的分钟数据。
 *  作者:陈镖任。
 */
#include "_public.h"
CLogFile logfile;

// 全国气象站点参数结构体。
struct st_stcode
{
    char provname[31]; // 省
    char obtid[11];    // 站号
    char obtname[31];  // 站名
    double lat;        // 纬度
    double lon;        // 经度
    double height;     // 海拔高度
};

// 全国气象站点分钟观测数据结构
struct st_surfdata
{
    char obtid[11];     // 站点代码。
    char ddatetime[21]; // 数据时间:格式yyyymmddhh24miss
    int t;              // 气温:单位,0.1摄氏度。
    int p;              // 气压:0.1百帕。
    int u;              // 相对湿度,0-100之间的值。
    int wd;             // 风向,0-360之间的值。
    int wf;             // 风速:单位0.1m/s
    int r;              // 降雨量:0.1mm。
    int vis;            // 能见度:0.1米。
};
// 获取当前时间,当作观测时间。
char strddatetime[21];

// 存放全国气象站点参数的容器。
vector<struct st_stcode> vstcode;

// 把站点参数文件中加载到vstcode容器中。
bool LoadSTCode(const char *inifile);

vector<struct st_surfdata> vsurfdata; // 存放全国气象站点分钟观测数据的容器

// 模拟生成全国气象站点分钟观测数据,存放在vsurfdata容器中。
void CrtSurfData();

// 把容器vsurfdata中的全国气象站点分钟观测数据写入文件。
bool CrtSurfFile(const char *outpath, const char *datafmt);

int main(int argc, char *argv[])
{
    // initfile outpath logfile
    if (argc != 5)
    {
        printf("Using:./crtsurfdata5 inifile outpath logfile datafmt\n");
        printf("Example:~/project/idc2/c/crtsurfdata5 ~/project/idc2/init/stcode.ini ~/tmp/surfdata ~/log/idc/crtsurfdata5.log xml,json,csv\n\n");

        printf("inifile 全国气象站点参数文件名。\n");
        printf("outpath 全国气象站点数据文件存放的目录。\n");
        printf("logfile 本程序运行的日志文件名。\n\n");
        printf("datafmt 生成数据文件的格式,支持xml、json和csv三种格式,中间用逗号分隔。\n\n");

        return -1;
    }

    // 打开程序的日志文件。
    if (logfile.Open(argv[3], "a+", false) == false)
    {
        printf("logfile.Open(%s) failed.\n", argv[3]);
        return -1;
    }

    logfile.Write("crtsurfdata5 开始运行。\n");

    // 把站点参数文件中加载到vstcode容器中。
    if (LoadSTCode(argv[1]) == false)
        return -1;

    // 模拟生成全国气象站点分钟观测数据,存放在vsurfdata容器中。
    CrtSurfData();

    // 把容器vsurfdata中的全国气象站点分钟观测数据写入文件。
    if (strstr(argv[4], "xml") != 0)
        CrtSurfFile(argv[2], "xml");
    if (strstr(argv[4], "json") != 0)
        CrtSurfFile(argv[2], "json");
    if (strstr(argv[4], "csv") != 0)
        CrtSurfFile(argv[2], "csv");

    logfile.Write("crtsurfdata5 运行结束。\n");

    return 0;
}

bool LoadSTCode(const char *inifile)
{
    CFile File;

    // 打开站点参数文件。
    if (File.Open(inifile, "r") == false)
    {
        logfile.Write("File.Open(%s) failed.\n", inifile);
        return false;
    }

    char strBuffer[301];

    CCmdStr CmdStr;

    struct st_stcode stcode;

    while (true)
    {
        // 从站点参数文件中读取一行,如果已读取完,跳出循环。
        if (File.Fgets(strBuffer, 300, true) == false)
            break;

        // 把读取到的一行拆分。
        CmdStr.SplitToCmd(strBuffer, ",", true);

        if (CmdStr.CmdCount() != 6)
            continue; // 扔掉无效的行。

        // 把站点参数的每个数据项保存到站点参数结构体中。
        memset(&stcode, 0, sizeof(struct st_stcode));
        CmdStr.GetValue(0, stcode.provname, 30); // 省
        CmdStr.GetValue(1, stcode.obtid, 10);    // 站号
        CmdStr.GetValue(2, stcode.obtname, 30);  // 站名
        CmdStr.GetValue(3, &stcode.lat);         // 纬度
        CmdStr.GetValue(4, &stcode.lon);         // 经度
        CmdStr.GetValue(5, &stcode.height);      // 海拔高度

        // 把站点参数结构体放入站点参数容器。
        vstcode.push_back(stcode);
    }

    /*
    for (auto x : vstcode)
        {
            logfile.Write("provname=%s,obtid=%s,obtname=%s,lat=%.2f,lon=%.2f,height=%.2f\n",
                          x.provname, x.obtid, x.obtname, x.lat,
                          x.lon, x.height);
        }
    */
    return true;
}

// 模拟生成全国气象站点分钟观测数据,存放在vsurfdata容器中。
void CrtSurfData()
{
    // 播随机数种子。
    srand(time(0));

    memset(strddatetime, 0, sizeof(strddatetime));
    LocalTime(strddatetime, "yyyymmddhh24miss");

    struct st_surfdata stsurfdata;

    // 遍历气象站点参数的vstcode容器。
    for (int i = 0; i < vstcode.size(); i++)
    {
        memset(&stsurfdata, 0, sizeof(struct st_surfdata));

        // 用随机数填充分钟观测数据的结构体。
        strncpy(stsurfdata.obtid, vstcode[i].obtid, 10); // 站点代码。
        strncpy(stsurfdata.ddatetime, strddatetime, 14); // 数据时间:格式yyyymmddhh24miss
        stsurfdata.t = rand() % 351;                     // 气温:单位,0.1摄氏度
        stsurfdata.p = rand() % 265 + 10000;             // 气压:0.1百帕
        stsurfdata.u = rand() % 100 + 1;                 // 相对湿度,0-100之间的值。
        stsurfdata.wd = rand() % 360;                    // 风向,0-360之间的值。
        stsurfdata.wf = rand() % 150;                    // 风速:单位0.1m/s
        stsurfdata.r = rand() % 16;                      // 降雨量:0.1mm
        stsurfdata.vis = rand() % 5001 + 100000;         // 能见度:0.1米

        // 把观测数据的结构体放入vsurfdata容器。
        vsurfdata.push_back(stsurfdata);
    }
    /*
    cout << vsurfdata.size() << endl;
    for (auto x : vsurfdata)
    {
        cout << x.ddatetime << " " << x.obtid << " " << x.p << " " << x.r << " " << x.t << " " << x.u << " " << x.vis << " " << x.wd << " " << x.wf << endl;
    }
    */
}

// 把容器vsurfdata中的全国气象站点分钟观测数据写入文件。
bool CrtSurfFile(const char *outpath, const char *datafmt)
{
    // 正确文件写入方法:
    // 创建临时文件
    // 往临时文件中写入数据
    // 关闭临时文件
    // 把临时文件改名为正式的文件


    CFile File;

    // 拼接生成数据的文件名,例如:/tmp/idc/surfdata/SURF_ZH_20240117092200_2254.csv
    char strFileName[301];
    sprintf(strFileName, "%s/SURF_ZH_%s_%d.%s", outpath, strddatetime, getpid(), datafmt);

    // 打开文件。
    if (File.OpenForRename(strFileName, "w") == false)
    {
        logfile.Write("File.OpenForRename(%s) failed.\n", strFileName);
        return false;
    }

    // 写入第一行标题。
    if (strcmp(datafmt, "csv") == 0)
        File.Fprintf("站点代码,数据时间,气温,气压,相对湿度,风向,风速,降雨量,能见度\n");

    // 遍历存放观测数据的vsurfdata容器。
    for (int i = 0; i < vsurfdata.size(); i++)
    {
        // 写入一条记录。
        if (strcmp(datafmt, "csv") == 0)
            File.Fprintf("%s,%s,%.1f,%.1f,%d,%d,%.1f,%.1f,%.1f\n",
                         vsurfdata[i].obtid, vsurfdata[i].ddatetime, vsurfdata[i].t / 10.0, vsurfdata[i].p / 10.0,
                         vsurfdata[i].u, vsurfdata[i].wd, vsurfdata[i].wf / 10.0, vsurfdata[i].r / 10.0, vsurfdata[i].vis / 10.0);
        if (strcmp(datafmt, "xml") == 0)
            File.Fprintf("<obtid>%s</obtid><ddatetime>%s</ddatetime><t>%.1f</t><p>%.1f</p>"
                         "<u>%d</u><wd>%d</wd><wf>%.1f</wf><r>%.1f</r><vis>%.1f</vis><endl/>\n",
                         vsurfdata[i].obtid, vsurfdata[i].ddatetime, vsurfdata[i].t / 10.0, vsurfdata[i].p / 10.0,
                         vsurfdata[i].u, vsurfdata[i].wd, vsurfdata[i].wf / 10.0, vsurfdata[i].r / 10.0, vsurfdata[i].vis / 10.0);
        if (strcmp(datafmt, "json") == 0)
        {
            File.Fprintf("{\"obtid\":\"%s\",\"ddatetime\":\"%s\",\"t\":\"%.1f\",\"p\":\"%.1f\","
                         "\"u\":\"%d\",\"wd\":\"%d\",\"wf\":\"%.1f\",\"r\":\"%.1f\",\"vis\":\"%.1f\"}",
                         vsurfdata[i].obtid, vsurfdata[i].ddatetime, vsurfdata[i].t / 10.0, vsurfdata[i].p / 10.0,
                         vsurfdata[i].u, vsurfdata[i].wd, vsurfdata[i].wf / 10.0, vsurfdata[i].r / 10.0, vsurfdata[i].vis / 10.0);
            if (i < vsurfdata.size() - 1)
                File.Fprintf(",\n");
            else
                File.Fprintf("\n");
        }
    }

    // 关闭文件。
    File.CloseAndRename();

    logfile.Write("生成数据文件%s成功,数据时间%s,记录数%d。\n", strFileName, strddatetime, vsurfdata.size());

    return true;
}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大语言模型测试数据的制作方法可以分为以下几个步骤: 1. 数据采集:根据你的需求确定要测试的领域或主题,并收集相关的文本数据。可以从互联网上的公开数据集、论文、书籍、新闻等来源获取数据。确保数据的质量和多样性,以便模型能够获得更全面的训练和测试。 2. 数据清洗:对采集到的原始数据进行清洗和预处理。这包括去除重复数据、去除噪声、处理缺失值和异常值等。确保数据的准确性和一致性,以提高模型的训练效果。 3. 数据划分:将清洗后的数据集划分为训练集、验证集和测试集。一般采用70%的数据作为训练集,15%作为验证集,15%作为测试集。训练集用于模型的训练,验证集用于调整模型的超参数,测试集用于评估模型的性能。 4. 数据标注:根据测试需求,对部分测试集进行人工标注。标注可以包括问题和答案对、问题类型、问题难度等信息。标注后的数据可用于评估模型在特定任务上的性能。 5. 数据格式转换:将清洗、划分和标注后的数据转换为模型可接受的格式。对于大语言模型,常见的格式包括文本文件(如txt、csv)或特定的数据集格式(如JSONXML)。 6. 数据扩充(可选):根据需求可以进行数据扩充,以增加模型训练的样本多样性和泛化能力。可以使用技术手段(如数据增强算法)对已有数据进行扩充,也可以采用生成模型(如生成对抗网络)生成新的样本。 7. 数据预处理:根据模型的要求对数据进行进一步的预处理。例如,将文本数据转换为数值向量表示,进行分词、词干提取、去停用词等操作。 8. 数据加载:将预处理后的数据加载到模型中进行训练和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值