最近帮一位学长处理一些气象数据
shell脚本有很多这种命令可以来处理
但好久没碰这些了,颇有些生疏
这次主要想通过c语言来操作
linux底下有个正则表达式的函数库
头文件— regex.h
不废话了
以下直接上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
int main()
{
//char *test="09:00:00.676: <- $WIMWV,153.1,R,14.8,N,A*18";
//上面为采集数据格式 主要获取首部的时间 R,参数前面的风向 N,前的风速
const char *pattern="([0-9,:]{8}).[0-9]{3}[^0-9]{11},(.*),[R,T],(.*),[K,N,S],[A,V][*]\\w{2}"; //正则表达式格式
//一般形如[]{}格式,前者内容,后者长度, ()用来获取对应匹配
regex_t reg; //结构体数据类型 用来存放编译后的正则表达式
int err,nm=5;
char errbuf[100]={0}; //错误提示缓冲区
char match[100]={0}; //用于记录匹配后的字符串
regmatch_t pmatch[nm]; //结构体存放匹配串在目标串中的开始和结束位置
//把制定的正则表达式pattern编译成一种特定的数据格式,增加匹配效率
if(err=regcomp(®,pattern,REG_EXTENDED)<0){
regerror(err,®,errbuf,sizeof(errbuf)); //判断是否正常
printf("err:%s\n",errbuf);
}
int i=0;
int len=0;
//一读一写
FILE *fp1=NULL;
FILE *fp2=NULL;
if((fp1=fopen("wind.txt","r"))==NULL){
printf("open wind error\n");
exit(-1);
}
fp2=fopen("wind_handle.txt","w+");
char lineData[50]={0}; //存放从文本中取出的一行字符串
while(!feof(fp1))
{
memset(lineData,0,sizeof(lineData));
fgets(lineData,sizeof(lineData),fp1); //读入n-1,最后加'\0'
//在读完n-1字符前遇到'\n'或结束符EOF,读入即结束
//printf("%s\n",lineData);
err=regexec(®,lineData,nm,pmatch,0); //开始匹配
if(err==REG_NOMATCH){
printf("no match\n");
exit(-1);
}else if(err){
regerror(err,®,errbuf,sizeof(errbuf));
printf("err:%s\n",errbuf);
exit(-1);
}
for(i=1;i<5&&pmatch[i].rm_so!=-1;i++){
len=pmatch[i].rm_eo-pmatch[i].rm_so;
if(len){ //如果有获取到匹配
memset(match,'\0',sizeof(match));
memcpy(match,lineData+pmatch[i].rm_so,len); //对应位置copy到缓冲区
//printf("%s\n",match);
fprintf(fp2,"%s\t",match); //写入文件(缓冲处) \t分割
}
}
fprintf(fp2,"\n");
fflush(fp2); //清空操作缓存,把数据写入文件中
}
regfree(®); //清空compiled指向的regex_t结构体内容
//重新编译的话,一定要先清空regex_t结构体
close(fp1);
close(fp2);
return 0;
}
正则表达对于处理数据来说不可或缺
大家可以多了解了解