如何从文件中读取数据并清理并存储到文件中
问题描述:
美好的一天。如何从文件中读取数据并清理并存储到文件中
我有一个文件,其中包含某些部分显示在下面的数据。它每三秒钟记录一次30天的记录。我想对数据执行以下操作。
2010-03-03 16:00:31; 66.89; 24.0; 14.89; 0.08;
2010-03-03 16:00:35; 66.15; 24.1; 14.85; 0.08;
2010-03-03 16:00:38; 67.10; 24.2; 14.81; 0.08;
2010-03-03 16:00:42; 66.36; 24.3; 14.78; 0.08;
2010-03-03 16:00:46; 65.83; 24.4; 14.75; 0.09;
.
.
.
2010-03-03 17:00:31; 62.78; 25.2; 13.96; 0.12;
2010-03-03 17:00:35; 63.94; 25.3; 13.92; 0.11;
2010-03-03 17:00:39; 61.94; 25.3; 13.89; 0.11;
2010-03-03 17:00:43; 60.99; 25.4; 13.88; 0.12;
2010-03-03 17:00:46; 62.67; 25.4; 13.89; 0.13;
2010-03-03 17:00:50; 62.57; 25.3; 13.91; 0.13;
2010-03-03 17:00:54; 61.51; 25.3; 13.91; 0.14;
.
.
.
2010-03-03 18:00:29; 66.04; 20.7; 13.63; 0.56;
2010-03-03 18:00:33; 66.04; 20.7; 13.63; 0.56;
2010-03-03 18:00:37; 65.52; 20.7; 13.59; 0.56;
2010-03-03 18:00:40; 64.46; 20.7; 13.56; 0.56;
2010-03-03 18:00:44; 64.88; 20.8; 13.56; 0.56;
.
.
.
- 阅读从第一行开始文件中的所有行。
2.对于每个小时,我想只计算第二列中的数据总和以及产生该总和的记录数。
3.And然后打印到文件中的以下信息:
i.Date;sum(1st hour),number of records that gave rise to this sum;sum(2nd hour),num_records;sum(3rd hour),num_records;...; sum total(24 hours),totol_records;mean
这是我想要如上述那样打印到文件中的示例;
03\03\2010; 15093.47; 379; 16025.46; 380; 14800.58; 379; 14605.34; 380; 21754.27,379;...;82279.12,1897;43,37
04\03\2010; 6842.051; 379; 7137.491; 380; 7215.16; 380; 7159.189; 379; 6594.672; 380;...;34948.56,1898;18,41
05\03\2010; 9938.37; 379; 9670.438; 380; 8232.032; 380; 9198.899; 379; 7083.687; 380;...;44123.426,1898;23,25
我已经开始使用此代码
int file_readline(char *file_in,char *outfile,char *strline) {
FILE *fd=NULL;
FILE *fo= NULL
char *date, *tmp,*time;
double sum=0;
double mean = 0;
strline=calloc(MAX_BUFFER_SIZE,sizeof(strline));
if (strline==NULL) {
printf ("Error calloc strline.................");
exit(EXIT_FAILURE);
}
file_in = calloc((strlen(strline)+strlen(file_in)),sizeof(file_in));
if (file_in==NULL)
{
printf ("Error calloc strline.................");
exit(EXIT_FAILURE);
}
fd=fopen(file_in,"r");
int i = 0;
int j = 0;
while ((fgets (strline, BUFSIZ, fd))>0 && !feof(fd)){
date = strtok(strline, " ");
time=strtok(NULL, " ");
tmp = strtok(NULL, ";");
if (i == 3) { // get only the 3rd value
sum += strtod(tmp, NULL);
++i;
// don't know how to proceed from here
答
我会通过对每行的数组接近这一点,然后通过数组解析,做你的计算,因为它看起来像你在做什么。它看起来像你的数据文件格式一致,所以不妨利用。将数组单元格存储在特定变量中,然后将它们转换为数学浮点数可能是最简单的方法。
答
enum {OUT,ADD};
void processline(int action,int hour,float val)
{
static int lasthour,z;
static float vals[25];
static int nums[25];
if(OUT==action)
{
if(lasthour)
{
int i;
for(i=1;i<=z;++i)
printf("%.2f; %d; ",vals[i],nums[i]);
printf("%d; %.2f\n",*nums,*vals);
lasthour=z=0;memset(vals,0,sizeof vals);memset(nums,0,sizeof nums);
}
return;
}
if(hour!=lasthour)
++z,lasthour=hour;
vals[z]+=val;
nums[z]++;
*vals+=val;
*nums+=1;
}
main()
{
char z[100],lastday[20]="";
FILE *f=fopen("test.txt","rt");
while(fgets(z,sizeof z,f))
{
char a[100],b[100];
float fl;
if(3==sscanf(z,"%[^ ]%[^;];%f",a,b,&fl))
{
if(strcmp(lastday,a))
{
if(*lastday)
printf("%s; ",lastday),processline(OUT,0,0);
strcpy(lastday,a);
}
processline(ADD,atoi(b),fl);
}
}
if(*lastday)
printf("%s; ",lastday),processline(OUT,0,0);
fclose(f);
return 0;
}
应该工作。 需要多少个Perl-Locs?
+0
wahooo !! 它像魔术一样工作!感谢你这个真棒代码。 – chriscol 2010-08-06 10:35:29
为什么你想在C中做这个任何特定的原因?像Perl这样的脚本语言似乎更适合这样的任务。 – 2010-08-04 16:21:35
你为什么要用C来做这样的工作?有很多替代品(例如,AWK,Perl)更适合这类任务,并且会使它变得非常简单。如果你需要某些东西(你没有在你的问题中提到过),那么C++会使它更简单一些,同时保留C – 2010-08-04 16:22:08
甚至C#.NET的所有功能,使用Sebastian Lorion的Fast CSV读者:http://www.codeproject.com/KB/database/CsvReader.aspx – 2010-08-04 16:23:01