免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: dourt
打印 上一主题 下一主题

[函数] 菜鸟:文本文件如何导入数据库表?请指点思路及主要函数 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2004-05-19 10:02 |只看该作者

菜鸟:文本文件如何导入数据库表?请指点思路及主要函数

原帖由 "dourt" 发表:
如果可行的话,如何判断是否读到空格呢?


如果可以用C++的话,代码就比较简单了。

  1. string field1;
  2. int field2;
  3. double field3;
  4. .....


  5. fstream fs("/home/yourfile", ios_base::in);
  6. while( fs.good() )
  7. {
  8.     fs >;>; field1 >;>; field2 ..... >;>; field17;
  9.     insert_to_db(field1, .....,  field17);
  10. }
复制代码

field1-17可以是已经有>;>;操作符的类型,没有就自己补上。空格,换行就由STL搞定吧。

论坛徽章:
0
12 [报告]
发表于 2004-05-19 10:28 |只看该作者

菜鸟:文本文件如何导入数据库表?请指点思路及主要函数

有看到你的文件有 ^M 说明有\r\n
那么fgets 是可以用的,

char * fgets(char *, int, FILE *);
char * 用你准备存放行的字段.
int       每行最大多少字符,用256够吧.
FILE * 打开的文件指针.

论坛徽章:
0
13 [报告]
发表于 2004-05-19 10:30 |只看该作者

菜鸟:文本文件如何导入数据库表?请指点思路及主要函数

原帖由 "dourt" 发表:



我用到的是sybase数据库操作系统为AIX。

但是文件的特点是流文件并不分行的,字段之间仅有空格分隔符。


不会吧?fgets绝对按行读取数据?难道AIX是异类?

论坛徽章:
0
14 [报告]
发表于 2004-05-19 10:40 |只看该作者

菜鸟:文本文件如何导入数据库表?请指点思路及主要函数

呵呵,楼主怪有意思的。好像在shell版见过呀
windflowers1976  老兄说得就是很常用的方法。
思路就是那样的,读一行,找空格,分割。付给一个结构相应字段,提交给数据库。
不过实际上可能会遇到好些问题。比如汉字问题啦,或者你的某个字段里面本身就有空格,结果处理成2个字段。按照你的说法,干脆,每一个记录只能输出16个空格,不是16,就算是一条坏记录,像 oracle  sqlload似的,将他记录到一个文件,集中处理。
flw,老大说得是,最好先考虑一下你的数据库是不是有专门的工具。
(文本里还有^M,windows下面弄来的??先tr 一下把)

论坛徽章:
0
15 [报告]
发表于 2004-05-19 12:18 |只看该作者

菜鸟:文本文件如何导入数据库表?请指点思路及主要函数

23072201010114600000 嘉荫县朝阳镇吉如食杂店 01 2004-05-13 00:00:00 0 0 0 50.00 0 0 0 0 0 0 0 0 50.00 23072201010067500000 嘉荫县朝阳镇橄榄绿美发厅 01 2004-05-13 00:00:00 0 0 0 56.00 0 0 0 0 0 0 0 0 56.00 23072201010050100000 嘉荫县朝阳镇休闲租书租碟 01 2004-05-13 00:00:00 35.00 6.00 180.00 15.00 0 0 9.00 4.00 0 0 0 0 249.00 23072201010050800000 嘉荫县朝阳镇安居旅店 01 2004-05-13 00:00:00 0 0 150.00 40.00 0 0 7.20 0 0 0 0 0 197.20

BabyBlue兄果然厉害,我在shell版询问过如何在文件中增加字段来着。
但是拆分文件我想在c/c++版更适宜吧。
文件格式如上。
linux_newbie得c++代码可能适用,可我不太熟悉:(
按照liusn2000的说发,我不能够用fgets()拉
用BCP又不是最佳选择
我改怎么办
按照你的说法,干脆,每一个记录只能输出16个空格,不是16,就算是一条坏记录,像 oracle sqlload似的,将他记录到一个文件,集中处理。

这可以实现吗? [/quote]

论坛徽章:
0
16 [报告]
发表于 2004-05-19 13:54 |只看该作者

菜鸟:文本文件如何导入数据库表?请指点思路及主要函数

原帖由 "dourt" 发表:
按照liusn2000的说发,我不能够用fgets()拉
用BCP又不是最佳选择
我改怎么办

这些都是别人的看法!你没有试一下怎么知道不可以?
是的,fgets()需要一个缓冲区接收一行数据,当缓冲区小的时候会出现比较麻烦的事情。但是看你的数据,把那个缓冲区定义大一点没什么问题。
我说得那个16个空格都是后话,如果你的数据严格按照空格分割,且字段都为17,就没有必要检查这些的。还有那些汉字的事,在你的系统会不会有问题现在谁也说不好。
C++偶也不懂,就用C呀。
没有必要总也把菜鸟2字放在前面。标题言简意赅,问题描述清楚,这里热心的人很多,熟悉这个问题的人自会给你建议的。
别的不说了,这样讨论没有用。你就大家的建议把程序写写看,就一行一行的读看看到底哪出现问题。至于优化都是后面的事情。
好运!

论坛徽章:
0
17 [报告]
发表于 2004-05-19 14:42 |只看该作者

菜鸟:文本文件如何导入数据库表?请指点思路及主要函数

呵呵,认为自己是菜鸟有助于求学的心态.
可是,不要等到需要自己去动手实践的时候还继续保持菜鸟的姿态,是不是希望谁帮你写个非常可用的实现,代码放到你机器下编译过后,生成可执行文件后,说,兄弟,好了,可以用了,去看看?
"言语上做矮子没事,可是行动上要做巨人."
有些人,实在太懒,所以无法成为高手.永远保持菜鸟状态.
呵呵,说的不好听,有些帖子,除非心情特好,实在也懒得回.

论坛徽章:
0
18 [报告]
发表于 2004-05-24 19:12 |只看该作者

菜鸟:文本文件如何导入数据库表?请指点思路及主要函数

风中花兄说得极是!
pfpf!我缺少的是这种精神。我会努力的。
现把经大家提示所获的解决放安公布如下:
  1. fgets(dszc,200,fp2);
  2. for(;dszc[i]!='\0';)
  3.        {
  4.         or(l=0;dszc[j]!=' ' && dszc[j]!='\0';j++,l++)
  5.                {
  6.                getch[l]=dszc[j];
  7.                }
  8.        k++; j++;
  9.        i=j;
  10.        if(k==1) strcpy(dsareastru.cusno,getch);
  11.        if(k==2) strcpy(dsareastru.cusnam,getch);
  12. ……
  13. }
复制代码

写表程序如下:
  1.     EXEC SQL  INSERT INTO DSSJ
  2.          VALUES ("", :dsareastru.cusno, :dsareastru.cusnam, "", :dsareastru.custyp, :dsareastru.cusqx,  ……"");……
复制代码

虽然很简单,但我也学到东西了。谢谢大家支持:)

论坛徽章:
0
19 [报告]
发表于 2004-05-24 19:36 |只看该作者

菜鸟:文本文件如何导入数据库表?请指点思路及主要函数

首先建立一个结构 :

struct  a
{
       int   x;
       char y;
       char   *z;
       ........
       struct  a  *link;
}


然后从文件中依次读入每一项,存入结构中,然后使用链表存入下一个结果。。。

祝你 成功

论坛徽章:
0
20 [报告]
发表于 2004-05-24 19:53 |只看该作者

菜鸟:文本文件如何导入数据库表?请指点思路及主要函数

    
我还以为我们的话语过重,太伤人了。
这并不是我们本意,其实程序还是自己多动手写写好。
错了再改,总比瞎想强!!!
虽然你的程序有点麻烦,只要先跑起来,不合适的地方再修改。
表示支持,我曾经用过fgets,但是我是封装了一下

  1. int mygetline(char *buf,int bufsize,FILE *fd){
  2.     if(fgets(buf,bufsize,fd)==NULL){
  3.        if(feof(fd)){
  4.           return -1;
  5.        }else{  return 1;}
  6.      }
  7.      return 0;}
复制代码
呵呵
像楼上说的,把一个记录定义一个结构吧,

  1. EXEC SQL insert into table_name values(:struct_name);
复制代码

Proc是可以这样写的,不知道你的数据库可以不可以,Goodluck! :wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP