| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 771 人关注过本帖
标题:发个从文件中读取身份证号15位升18位的小程序(如果不是唯一字段 还有待完善 ...
取消只看楼主 加入收藏
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:2 
发个从文件中读取身份证号15位升18位的小程序(如果不是唯一字段 还有待完善 请大神指点)
以下代码只是模拟从文本文件中读取每行起始处为15位的身份证号
如果文件格式为其它样式则不成立
只为抛砖引玉
希望看到能从dbf3以上版本文件中读取某个字段的15位(自动排除18位)身份证号
并升级成18位身份证号后写入原始dbf文件的C代码

程序代码:
#include <stdio.h>
#include <stdlib.h>

int readNum(int *n, FILE *fp);
void newId(char *id, int *n);
int calc(int *n);
void writeFile(FILE *fn, char *id);

int main(int argc, char *argv[]) {
    int n[17] = {0, 0, 0, 0, 0, 0, 1, 9,};
    const char s[11] = "10X98765432";
    char id[18];
    FILE *fp, *fn;

    if(argc != 3) exit(EXIT_FAILURE);

    fp = fopen(argv[1], "r");
    fn = fopen(argv[2], "w+");

    if(!fp || !fn) exit(EXIT_FAILURE);

    else {
        while(!feof(fp)) {
            if(readNum(n, fp) == EOF) break;

            newId(id, n);
            id[17] = s[calc(n)];
            writeFile(fn, id);
        }
    }

    fclose(fp);
    fclose(fn);
    return 0;
}

int readNum(int *n, FILE *fp) {
    int i, ch;

    for(i = 0; i < 6; i++) fscanf(fp, "%1d", n + i);

    for(i = 8; i < 17; i++) fscanf(fp, "%1d", n + i);

    while((ch = getc(fp)) != '\n' && ch != EOF);

    return ch;
}

void newId(char *id, int *n) {
    int i = -1;

    while(++i < 17) id[i] = n[i] + '0';
}

int calc(int *n) {
    int i = -1, s = 0;
    const int m[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};

    while(++i < 17) s += n[i] * m[i];

    return s % 11;
}

void writeFile(FILE *fn, char *id) {
    int i = -1;

    while(++i < 18) putc(id[i], fn);

    putc('\n', fn);
}
搜索更多相关主题的帖子: 文本文件 身份证号 
2015-03-18 19:17
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
有几百个dbf数据文件
都是多个字段 身份证号为其中的一个字段 15位18位混杂
数据表中每一行都代表1个人的信息
一个人可能在多个数据文件中反复出现 部分字段的信息有变更
而且该人的身份证号在不同的文件中可能是15位也可能是18位
每个文件有10几万条数据
现在想把这些文件合并成一个
针对每个人只保留最新的记录(以某几个字段为校验标准)
类似于数据表去重

所以才想起把15位都升成18位
以方便去重

只是有这么个想法
所以从升级身份证号开始试着写一下
由于对dbf文件格式不熟
没再继续了

Only the Code Tells the Truth             K.I.S.S
2015-03-19 22:14
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
别人已经使用了十几年的东西
我是看到后有点实在看不下去了

最初我想劝使用者将数据导出后
再导入到一个新的数据库表里会比较好处理
但是使用者认为目前使用良好
也不几百个表的操作

由于文件不是我的 还带有隐私性
我也不好说什么
毕竟那些人已经用惯了

只是想看看能不能写个通用的程序
交给别人执行一下就行了
不过还是心有余而力不足
算了

Only the Code Tells the Truth             K.I.S.S
2015-03-19 22:33
快速回复:发个从文件中读取身份证号15位升18位的小程序(如果不是唯一字段 还有 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017590 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved