QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1333|回复: 19

求助

[复制链接]
发表于 2004-9-9 12:28:57 | 显示全部楼层 |阅读模式
谁会阿
发表于 2004-9-9 13:04:03 | 显示全部楼层
用perl、python等在表达式处理功能上强大的语言写个脚本。
回复

使用道具 举报

 楼主| 发表于 2004-9-9 13:16:02 | 显示全部楼层
具体呢
回复

使用道具 举报

发表于 2004-9-9 13:34:33 | 显示全部楼层
这两种脚本语言我只略知皮毛。我的意思主要是利用它们的文本搜索功能,寻找匹配的正则表达式。比如前面有g_字串,两头有“”的字串就可以提取出来写入另一个文件。我想比较简单吧。
回复

使用道具 举报

 楼主| 发表于 2004-9-9 13:40:20 | 显示全部楼层
要是用C呢?
回复

使用道具 举报

发表于 2004-9-9 13:49:34 | 显示全部楼层
那就麻烦一些了。毕竟是通用语言。
回复

使用道具 举报

发表于 2004-9-9 14:34:26 | 显示全部楼层
vim和emacs应该都能做,但我不会
用c做一个转换程序,应该不难。
回复

使用道具 举报

 楼主| 发表于 2004-9-9 14:49:21 | 显示全部楼层
谁知道怎莫作阿
回复

使用道具 举报

发表于 2004-9-9 14:55:33 | 显示全部楼层
把所有文件里的东西按 "12345678"| 1|1900|1|1|"China"|"NoMail"|"NoSerial"|"SS521"|"MKF010MKF010" 这种格式放到一个文件里比如newfile,然后原来的每个文件里的东西在newfile占一行?
回复

使用道具 举报

发表于 2004-9-9 15:12:05 | 显示全部楼层
怎么好象每个文件里只有一行,而且这一行里只有两个字符串啊?那么应该不难的吧……
回复

使用道具 举报

发表于 2004-9-9 15:47:18 | 显示全部楼层
找个脚本高手帮你解决,我对脚本一窍不通。
回复

使用道具 举报

发表于 2004-9-9 16:17:38 | 显示全部楼层
没事干给你写了一段c
[code:1]
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
char *key[]=
{"g_Tel","g_Sex","g_Year","g_Month","g_Day","g_Address",
    "g_Mail","g_Serial","g_Account","g_Password"
};

int main(int argc,char **argv)
{
    DIR *mdir;
    struct dirent *ent;
    struct stat st;
    int i,j;
    FILE *fp;
    char line[128];
    char filename[FILENAME_MAX];

    mdir=opendir(argv[1]);
    if(!mdir)
        return 0;
    while(ent=readdir(mdir))
    {
        sprintf(filename,"%s/%s",argv[1],ent->d_name);
        lstat(filename,&st);
        if(!S_ISREG(st.st_mode))
            continue;
        fp=fopen(filename,"r");
        if(!fp)
            continue;
        while(fgets(line,128,fp) != NULL)
        {
            for(i=strlen(line);i>0;i--)
            {
                if(line[i-1] == '\n')
                {
                    line[i-1]='\0';
                    break;
                }
            }
            for(i=0;i<10;i++)
            {
                if(strncmp(line,key[i],strlen(key[i])) == 0)
                {
                    j=strlen(key[i])+1;
                    for(;j<strlen(line);j++)
                    {
                        if(line[j] != ' ')
                            break;
                    }
                    if(i<9)
                        printf("%s|",line+j);
                    else
                        printf("%s\n",line+j);
                }
            }
        }
        fclose(fp);
    }
    closedir(mdir);
}

[/code:1]
回复

使用道具 举报

 楼主| 发表于 2004-9-9 17:15:42 | 显示全部楼层
直接可以运行吗?
回复

使用道具 举报

发表于 2004-9-9 17:47:05 | 显示全部楼层
gcc xxx.c -o xxx
xxx /path/to/datafile >newfile

/path/to/datafile是几百万文件所在目录
回复

使用道具 举报

 楼主| 发表于 2004-9-10 11:01:31 | 显示全部楼层
[quote:2a47590be3="mozilla"]没事干给你写了一段c
[code:1]
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
char *key[]=
{"g_Tel","g_Sex","g_Year","g_Month","g_Day","g_Address",
    "g_Mail","g_Serial","g_Account","g_Password"
};

int main(int argc,char **argv)
{
    DIR *mdir;
    struct dirent *ent;
    struct stat st;
    int i,j;
    FILE *fp;
    char line[128];
    char filename[FILENAME_MAX];

    mdir=opendir(argv[1]);
    if(!mdir)
        return 0;
    while(ent=readdir(mdir))
    {
        sprintf(filename,"%s/%s",argv[1],ent->d_name);
        lstat(filename,&st);
        if(!S_ISREG(st.st_mode))
            continue;
        fp=fopen(filename,"r");
        if(!fp)
            continue;
        while(fgets(line,128,fp) != NULL)
        {
            for(i=strlen(line);i>0;i--)
            {
                if(line[i-1] == '\n')
                {
                    line[i-1]='\0';
                    break;
                }
            }
            for(i=0;i<10;i++)
            {
                if(strncmp(line,key[i],strlen(key[i])) == 0)
                {
                    j=strlen(key[i])+1;
                    for(;j<strlen(line);j++)
                    {
                        if(line[j] != ' ')
                            break;
                    }
                    if(i<9)
                        printf("%s|",line+j);
                    else
                        printf("%s\n",line+j);
                }
            }
        }
        fclose(fp);
    }
    closedir(mdir);
}

[/code:1][/quote]
是一个文件夹里有N多.o文件
譬如说目录/83里有好几十万个.o文件 要把它合并成一个文挡(执行结果)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 13:39 , Processed in 0.047181 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表