散分讨论:C#实现文本到数据库的导入问题

Lengjian 2007-06-29 10:48:49
文本文档:
格式固定,列之间以空格隔开

数据库:
表已经存在,列已经存在,列和文本文档的列完全对应

要求:
实现从文本到表的数据自动导入,大家一般如何处理?
(逐行逐列读取导入貌似很不合理,效率也很低)
...全文
756 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
tepc2000 2007-07-02
  • 打赏
  • 举报
回复
up
Lengjian 2007-06-29
  • 打赏
  • 举报
回复
呵呵,原来我是这么写的:

枚举指定文件夹里面的文件名;
循环读取每个文件;
循环读取文件里面的行;
按照空格split列;
列写入数据集;
数据集写到数据库表;

个人觉得资源消耗挺多的(每个文档数百万条数据),而且效率也不尽如人意;

刚才楼上的朋友提出了存储过程,我写存储过程一般就在数据库中直接写,但是这样就不好形成一个通用的可在多种环境下重复使用的控件。

大家还有什么思路,一起来谈一谈。
Avoid 2007-06-29
  • 打赏
  • 举报
回复
一条SQL语句就能实现的。

何必舍近求远写一大堆代码呢?
QuinsonYue 2007-06-29
  • 打赏
  • 举报
回复
up
Fan52027 2007-06-29
  • 打赏
  • 举报
回复
我在工作中也碰到和樓主一樣的問題,我的解決辦法是,寫一個公司,可以實現把N個txt文件合并成一個txt文件,然后用循環導入數據庫。
wangsaokui 2007-06-29
  • 打赏
  • 举报
回复
bcp将文本文件循环导入SqlServer
数据库Test中有表Files和Data,Files中保存着txt文本的地址,写个存储将txt文本地址循环读出并使用bcp命令将txt文本里面的数据导入sqlserver中

CREATE PROCEDURE import
AS
declare @FilePath varchar(50)
declare @sql varchar(1000)

DECLARE table_cur CURSOR FOR
SELECT path FROM Files

OPEN table_cur
FETCH NEXT FROM table_cur INTO @FilePath

WHILE @@fetch_status = 0
BEGIN
set @sql='bcp Test..Data in '+@FilePath+' -S -Usa -P1 -c -t, '
EXEC master..xp_cmdshell @sql

FETCH NEXT FROM table_cur INTO @FilePath
END
DEALLOCATE table_cur
GO
wangsaokui 2007-06-29
  • 打赏
  • 举报
回复
** 导入文本文件
EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword'

/** 导出文本文件
EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword'

EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'

导出到TXT文本,用逗号分开
exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password'


BULK INSERT 库名..表名
FROM 'c:\test.txt'
WITH (
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'

做一个存储过程,然后C#调用
Lengjian 2007-06-29
  • 打赏
  • 举报
回复
看到网上也有不少朋友问的,不如大家都发表高见,然后我们做一个通用控件贴上来
guyehanxinlei 2007-06-29
  • 打赏
  • 举报
回复
UP
Lengjian 2007-06-29
  • 打赏
  • 举报
回复
TO leng9996(探针) :给我一个拜读一下,呵呵,有现成的就更好了
tujiaping 2007-06-29
  • 打赏
  • 举报
回复
貌似见过一个用odbc做的,你网上找一下,应该找得到的
leng9996 2007-06-29
  • 打赏
  • 举报
回复
什么数据库阿,如果是ms的,可以用bcp命令,这个效率比较高
我做过这个,需要的话可以发代码给你
greenery 2007-06-29
  • 打赏
  • 举报
回复
如果你的文件格式是用逗号分割的话,好象可以用CVS模式作为数据源导入
DarkChampion 2007-06-29
  • 打赏
  • 举报
回复
up
ztenv 2007-06-29
  • 打赏
  • 举报
回复
两重循环:1 重找到所有的文件,API可以实现找到所有的指定类型的文件
2重循环读取一个文件中的数据并写入到数据库
最好用多线程来实现,做成一个服务更好,
大个啊 2007-06-29
  • 打赏
  • 举报
回复
sql的导入工具也是循环读取写入的
Lengjian 2007-06-29
  • 打赏
  • 举报
回复
这个方案的起因是:我要将每天的文本日志导入导入到sql server中,现在想用程序实现,但是写的循环效率太低了,你想啊,用文本作为数据源,通过sql的导入工具很轻松就导入了,那么用程序自动执行这一操作呢?应该也是可以的吧?大家都来说说自己觉得好的方案。
Lengjian 2007-06-29
  • 打赏
  • 举报
回复
这一切都要通过程序自动实现,手动实现的就不要包含在此次讨论中了,大家先讨论,然后我写一个控件贴上来一起切磋一番。
wzd24 2007-06-29
  • 打赏
  • 举报
回复
Lengjian(飞扬) ( ) 信誉:100 Blog 加为好友 2007-06-29 11:15:47 得分: 0


附加条件:
这样的文本有n多个,类似于日志那样的,每天都生成好多个,呵呵,要先获取文件名,然后将指定路径的文档挨个向数据库表中导入。
呵呵,大家继续出谋划策。

-----------------------------------------------------------------
用程序循环处理!!!最简单!
Lengjian 2007-06-29
  • 打赏
  • 举报
回复
附加条件:
这样的文本有n多个,类似于日志那样的,每天都生成好多个,呵呵,要先获取文件名,然后将指定路径的文档挨个向数据库表中导入。
呵呵,大家继续出谋划策。
加载更多回复(9)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧