文本文件批量合并小工具 » 荒野无灯weblog

Keep It Simple, Stupid.

荒野无灯weblog

文本文件批量合并小工具

在深圳时,奔爷有一小说要合并,win下用批处理貌似不好办,Linux下的shell 命令我也不是很熟悉,还是用C语言写一个吧,于是操刀(VIM)开工。因此有了这篇文章。程序很简单,没啥技术含量,拿出来与大家分享。有兴趣的童鞋可以一起来修改它。

Usage:./filecombine prefix start end [combine_name] [fileext]

Description:此程序用来合并命名有规律的txt文件为一个文件,
如foo1.txt , foo2.txt ,foo3.txt …… foo199.txt , foo200.txt
参数解释:
prefix: 文件共同的前缀(比如上面的 foo)
start: 要合并的文件的开始数字(如1)
end: 要合并的文件的结束数字(如200)
combine_name: 合并后的文件名称(可选)
fileext: 文件后缀(默认为.txt,可选)

gcc -Wall -o filecombine -O3 filecombine.c

源码如下,可在WIN32或者Linux 32下编译运行。win下access函数是用头文件io.h,linux下没有这个文件,包含于unistd.h中。
附上源码包,里面包含WIN32和LINUX下的可执行文件:

filecombine.tar.gz (9.6 KB)

/*
 * =====================================================================================
 *
 *       Filename:  filecombine.c
 *
 *    Description: 此程序用来合并命名有规律的txt文件为一个文件,如foo1.txt , foo2.txt ,foo3.txt ...... foo199.txt , foo200.txt
 *      用法:filecombine.exe 文件共同的前缀(比如上面的 foo) 要合并的文件的开始数字(如1) 要合并的文件的结束数字(如200) [合并后的文件名称]
 *          (可选) [文件后缀](默认为.txt,可选)
 *        Version:  1.0
 *        Created:  2011年03月01日 21时52分28秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  荒野无灯 (HuangYeWuDeng), admin#ihacklog.com
 *        Company:  hhtc edu
 *
 * =====================================================================================
 */
#include 
#include 
#include 
#include 
#include 
#include 

#if defined(WIN32)
#include 
#elif defined(__linux__)
#include 
#endif

#define CHUNK_SIZE 512

off_t filesize(char *);

int
main(int argc,char *argv[])
{
    printf("                   ************文本文件批量合并小工具************\n");

    if(argc<4)
    {
        printf("Error parameter!\n");
        printf("Usage:%s prefix start end [combine_name] [fileext]\n\n",*argv);
        printf("Description:此程序用来合并命名有规律的txt文件为一个文件,\n如foo1.txt , foo2.txt ,foo3.txt ...... foo199.txt , foo200.txt\n参数解释:\nprefix:        文件共同的前缀(比如上面的 foo) \nstart:         要合并的文件的开始数字(如1)\nend:           要合并的文件的结束数字(如200) \ncombine_name:  合并后的文件名称(可选) \nfileext:       文件后缀(默认为.txt,可选)\n\n");
        printf("--------------------------------------------------a small tool by 荒野无灯\n");
        printf("--------------------------------------------------http://www.ihacklog.com\n\n");
        return -1;
    }

    FILE *fp;
    FILE *fpw;
    char fileext[10];
    char combine_filename[200];
    char renamed_combine_filename[300]; 
    if(argc==6)
        sprintf(fileext,"%s",argv[5]);
    else
        strcpy(fileext,".txt");

    if(NULL !=argv[4])
    sprintf(combine_filename,"%s_combined%s",argv[4],fileext);
    else
    sprintf(combine_filename,"%s_combined%s",argv[1],fileext);

    if(!access(combine_filename,0x00))
    {
        char timebuf[100];
        time_t t;
        time (&t);
        strftime(timebuf, sizeof(timebuf),"%Y-%m-%d-%H%M%S", localtime(&t));

        sprintf(renamed_combine_filename,"%s_%s",timebuf,combine_filename);
        printf("注意:文件%s已经存在,合并后的文件名为:%s\n",combine_filename,renamed_combine_filename);

    }
    else
    {
        strcpy(renamed_combine_filename,combine_filename);
    }

    fpw=fopen(renamed_combine_filename,"ab");
    if(!fpw)
        {
            printf("create file %s failed!\n",renamed_combine_filename);
            return -1;
        }
        int i;

    int start_num=atoi(argv[2]);
    int end_num=atoi(argv[3])+1;
    for(i=start_num;i0 )
            {
            toread=( file_size>CHUNK_SIZE )?CHUNK_SIZE:file_size;
            fread(data,toread,1,fp);
            fwrite(data,toread,1,fpw);
            file_size-=toread;
            }
        }
        fclose(fp);

    }
        fclose(fpw);
        printf("文件合并成功!合并后的文件名为:%s\n",renamed_combine_filename);
    return 0;

}

off_t
filesize(char *filename)
{
    struct stat s;
    if(0 != stat(filename,&s))
            return -1;
    return s.st_size;

}

Tagged in : c/c++,文件文件,合并,txt

All Comments (0)
Gravatar image
No Comments