| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 771 人关注过本帖
标题:发个从文件中读取身份证号15位升18位的小程序(如果不是唯一字段 还有待完善 ...
只看楼主 加入收藏
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:10 
发个从文件中读取身份证号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
lovegh
Rank: 5Rank: 5
来 自:图灵学院
等 级:职业侠客
威 望:3
帖 子:117
专家分:311
注 册:2015-1-23
收藏
得分:14 
没接触过dbf这种数据库文件,是微软的VFP吧?我是来接分的,哈哈。

别老是写代码,要多陪妹子,多了解老婆大人,血淋淋的教训。
2015-03-18 19:54
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
收藏
得分:14 
哇 这种帖子果断顶起。坐等 大婶们的补充。
楼主棒棒棒!!!

授人以鱼,不如授人以渔
2015-03-18 19:55
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:14 
可以自己设计一个小型文本型数据库格式

DO IT YOURSELF !
2015-03-18 20:08
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:14 
向楼主学习
2015-03-18 20:22
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:14 
文件这方面没学好

一片落叶掉进了回忆的流年。
2015-03-18 20:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你想幹什麽?

授人以渔,不授人以鱼。
2015-03-19 21:58
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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 8楼 longwu9t
這個現象,首先是設計系統的人的確不熟悉數據庫,設計的東西沒按數據庫規範來,就必然出現這種問題,反過來說,數據庫規範其實正是由實踐經驗總結出來針對這類問題的。其次,用數據庫本身解決比用C高效,所以我問你想幹什麽,純粹是玩的可以寫一下,若是真要用的,不必如此。

授人以渔,不授人以鱼。
2015-03-19 22:19
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.017074 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved