文本文件批量合并小工具

在深圳时,奔爷有一小说要合并,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,可选)

1
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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * =====================================================================================
 *
 *       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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>

#if defined(WIN32)
#include <io.h>
#elif defined(__linux__)
#include <unistd.h>
#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 (&#038;t);
        strftime(timebuf, sizeof(timebuf),"%Y-%m-%d-%H%M%S", localtime(&#038;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;i<end_num;i++)
    {
        char fname[200];
        strcpy(fname,argv[1]);
        char tmp[10];
        sprintf(tmp,"%d",i);
        strcat(fname,tmp);
        strcat(fname,fileext);
        fp=fopen(fname,"rb");
        if(!fp)
        {
            printf("Error:\nopen file %s failed!perhaps file does not exists.\n",fname);
            return -1;
        }
        else
        {
        printf("正在添加文件:  %s ......\n",fname);
            char data[CHUNK_SIZE+1];
            int file_size=filesize(fname);
            int toread;
            while(file_size>0 )
            {
            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,&#038;s))
            return -1;
    return s.st_size;

}
更多
16 Responses Post a comment
  1. hit9

    真该学习下你的折腾精神!无折腾,不青春

  2. 小邪

    喔喔,当时一朋友老说QT,我很囧地问他为什么不用VC,他瞬间一脸蛋疼的表情,囧。

  3. 荒野无灯

    一行一行来效率太低,这里是按固定大小的字节数来读取。

  4. 老饕

    我之前有过一款增强的TXT,可以合并文本~~呵呵,你可真能折腾!

  5. 荒野无灯

    要GUI的话,如果是WIN下面,直接把窗口按钮神马的拖出来加些事件折腾一翻就OK了,如果是LINUX的话,可以用QT或者GTK .

  6. 无冷

    用C读取挨个去读txt,然后一行一行复制到缓存,再合并么?
    个人感觉思路是这样。

  7. 小邪

    嘿嘿,看到你FO我,就顺便来露个脸。
    顺便有个疑问,C语言这样子写是在shell里面执行的,那么如何弄出GUI界面呢? :mrgreen: :mrgreen:

  8. 依云

    囧,shell 扩展 * 时是按编码排序的,要按数字的话还得用 sort,再 xargs 给 cat,可是 UnxUtils 的 xargs 不能用。。。

    你练手竟然用 C。。。好吧,我只有在没有办法的时候才会用 C 的。。。

  9. 荒野无灯

    直接用cat貌似不能按数字顺序合并的。至于用PHP嘛,当然非常容易,呵呵。之所以用C完全是为了练手,两个月没有怎么摸键盘了,练习下,找下手感。。。 :cool:

  10. 铅笔小新

    cat 应该是可以的,我经常用它来合并文本,只不过不是txt的,你可以切到Linux下试下 ~呵呵~ win的工具不熟。。。

  11. 依云

    Win 下用 copy 可以合并文件。当然更好(和可靠)的办法是下个 UnxUtils,里边有常用的 cat 之类的工具。

    话说这种事你怎么拿 C 上了呢,好歹还有那么多脚本语言呢,PHP 也可以嘛。

  12. 荒野无灯

    已经证实的是: win下

    1
    type 背后有人*.txt >all.txt

    是不行的

Leave a Reply

Note: You may use basic HTML in your comments. Your email address will not be published.

Subscribe to this comment feed via RSS