txt文件导入到数据库(access或者sql),代码如何实现?

时间:2021-07-21 07:58:11
txt文件的格式如下:
Time=2009-02-24 00:15:24
Sender=张三
Receivers=李四,赵六
Msg=你好
---------------------------------------------------------------------------
Time=2009-02-24 00:16:10
Sender=王五
Receivers=赵六
Msg=你好
---------------------------------------------------------------------------
Time=2009-02-24 00:15:58
Sender=王五
Receivers=赵六,李四
Msg=你好

把这些数据导入到access或者sql数据库中,请哪位高手指点迷津,希望能给出完整的代码参考,VB或VC的代码都可以,或者哪位高手留下QQ或者MSN,我加你,教我怎么写也行,小女子感激涕零!!!

7 个解决方案

#1


SQL的写法,用程序的话得把文本转换成数据集再插入
文本文件和数据表结构得对应。

/** 导入文本文件 
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’ 

#2


小女子?

  /**   导入文本文件   
  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'   
  )   
    
    
  --/*   dBase   IV文件   
  select   *   from     
  OPENROWSET('MICROSOFT.JET.OLEDB.4.0'   
  ,'dBase   IV;HDR=NO;IMEX=2;DATABASE=C:\','select   *   from   [客户资料4.dbf]')   
  --*/   
    
  --/*   dBase   III文件   
  select   *   from     
  OPENROWSET('MICROSOFT.JET.OLEDB.4.0'   
  ,'dBase   III;HDR=NO;IMEX=2;DATABASE=C:\','select   *   from   [客户资料3.dbf]')   
  --*/   
    
    
    
  /*   
    实现数据导入/导出的存储过程   
                    根据不同的参数,可以实现导入/导出整个数据库/单个表   
    调用示例:   
  --导出调用示例   
  ----导出单个表   
  exec   file2table   'zj','','','xzkh_sa..地区资料','c:\zj.txt',1   
  ----导出整个数据库   
  exec   file2table   'zj','','','xzkh_sa','C:\docman',1   
    
  --导入调用示例   
  ----导入单个表   
  exec   file2table   'zj','','','xzkh_sa..地区资料','c:\zj.txt',0   
  ----导入整个数据库   
  exec   file2table   'zj','','','xzkh_sa','C:\docman',0   
    
  */   
  if   exists(select   1   from   sysobjects   where   name='File2Table'   and   objectproperty(id,'IsProcedure')=1)   
    drop   procedure   File2Table   
  go   
  create   procedure   File2Table   
  @servername   varchar(200)         --服务器名   
  ,@username   varchar(200)             --用户名,如果用NT验证方式,则为空''   
  ,@password   varchar(200)             --密码   
  ,@tbname   varchar(500)             --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表   
  ,@filename   varchar(1000)         --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt   
  ,@isout   bit                         --1为导出,0为导入   
  as   
  declare   @sql   varchar(8000)   
    
  if   @tbname   like   '%.%.%'   --如果指定了表名,则直接导出单个表   
  begin   
    set   @sql='bcp   '+@tbname   
        +case   when   @isout=1   then   '   out   '   else   '   in   '   end   
        +'   "'+@filename+'"   /w'   
        +'   /S   '+@servername   
        +case   when   isnull(@username,'')=''   then   ''   else   '   /U   '+@username   end   
        +'   /P   '+isnull(@password,'')   
    exec   master..xp_cmdshell   @sql   
  end   
  else   
  begin     --导出整个数据库,定义游标,取出所有的用户表   
    declare   @m_tbname   varchar(250)   
    if   right(@filename,1)<>'\'   set   @filename=@filename+'\'   
    
    set   @m_tbname='declare   #tb   cursor   for   select   name   from   '+@tbname+'..sysobjects   where   xtype=''U'''   
    exec(@m_tbname)   
    open   #tb   
    fetch   next   from   #tb   into   @m_tbname   
    while   @@fetch_status=0   
    begin   
        set   @sql='bcp   '+@tbname+'..'+@m_tbname   
            +case   when   @isout=1   then   '   out   '   else   '   in   '   end   
            +'   "'+@filename+@m_tbname+'.txt   "   /w'   
            +'   /S   '+@servername   
            +case   when   isnull(@username,'')=''   then   ''   else   '   /U   '+@username   end   
            +'   /P   '+isnull(@password,'')   
        exec   master..xp_cmdshell   @sql   
        fetch   next   from   #tb   into   @m_tbname   
    end   
    close   #tb   
    deallocate   #tb       
  end   
  go   
 

#3


Time=2009-02-24 00:15:24 
Sender=张三 
Receivers=李四,赵六 
Msg=你好 
--------------------------------------------------------------------------- 
Time=2009-02-24 00:16:10 
Sender=王五 
Receivers=赵六 
Msg=你好 
--------------------------------------------------------------------------- 
Time=2009-02-24 00:15:58 
Sender=王五 
Receivers=赵六,李四 
Msg=你好 

这个不好弄啊。
要先把一些无用的信息去掉,
用for 循环 读取每行的数据,放到一个哈希表中。
然后一个取出来,用=分隔,取第二个数作为数值

用循环插入数据库。

#4


参考
给个例子:   
  用delphi将纯文本文件转换成数据库文件     
    在开发数据库应用程序时,有时需要将纯文件格式的文件转换为数据库类型的文件。下面,结合笔者所开发的具体应用实例,来说明这一转换方法。   
    
    笔者所开发的是“人事考勤管理系统”,在这一系统中,需要将考勤刷卡机所生成的员工考勤数据(纯文本格式)转换到paradox5.0格式的数据库中,以便于应用程序对数据库进行统计查询等操作。   
    
    1、下面是考勤刷卡机生成的员工考勤数据文件(文件名为kq.txt)的格式:   
    
    01000315 9801051428a0   
    
    01000820 9801051429a1   
    
    01000659 9801051429b2   
    
    01000883 9801051429b3   
    
    01000173 9801051429a4   
    
    ………   
    
    说明:   
    
    ●每一行为某一员工某一次的刷卡记录数据   
    
    ●行宽固定为27个字符   
    
    ●1~2字符为刷卡机代码:01代表1号刷卡机,02代表2号刷卡机,依此类推   
    
    ●3~15字符为员工考勤工号,共有13位,本系统只用了6位,000315为员工工号   
    
    ●16~25字符为刷卡时间,9801051428意即98年1月5日14点28分   
    
    ●26字符为刷卡状态,a为上班,b为下班   
    
    ●27字符为流水号,0~9为一循环   
    
    2、paradox数据库类型文件kq.db数据库结构如下:   
    
    共有4个字段   
    
    ●工号:字符类型,宽度为6   
    
    ●日期:字符类型,宽度为8   
    
    ●时间:字符类型,宽度为5   
    
    ●进/出:字符类型,宽度为2   
    
    此文件可由数据库桌面database   desktop创建,并保存到c:ιkq子目录中。   
    
    3、从kq.txt到kq.db的转换方法如下:   
    
    (1)建立窗体(如下图所示),设置窗体各控件的属性。   
    
       
    
    此窗体共有两个按钮(button1和button2),一个数据表(table1),一个数据源(datasource1)和一个数据网格(dbgrid1),它们的属性分别如下:   
    
    ●button1.caption:=转换   
    
    ●button2.caption:=退出   
    
    ●table1.databasename:=c:\kq   
    
    table1.tablename:=kq.db   
    
    ●datasource1.dataset:=table1   
    
    ●dbgrid1.datasource:=datasource1   
    
    (2)转换处理程序如下:   
    
    procedure   tform1.button1click(sender:tobject);   
    
    var   
    
    str:string;   
    
    txtfile:textfile;{定义一个文本文件变量txtfile}   
    
    ch:char;   
    
    begin   
    
    table1.open;{打开kq.db数据库}   
    
    assignfile(txtfile,′c:\kq\kq.txt′);{将kq.txt分配给txtfile变量}   
    
    reset(txtfile);{打开kq.txt文本文件}   
    
    str:=′′;   
    
    while   not   eof(txtfile)do{只要kq.txt文件没有结束,就循环转换}   
    
    begin   
    
    read(txtfile,ch);{从kq.txt中读一个字符}   
    
    if   ch<>char(13)then{是否为回车符}   
    
    str:=str+ch{不是回车,继续读下一个字符}   
    
    else   
    
    begin{是回车符,表明已经读完一行,此时str变量即代表一行信息}   
    
    table1.append;{将kq.db数据库追加一空记录}   
    
    table1.edit;{将kq.db数据库设为可编辑}   
    
    table1.fieldbyname(′工号′).asstring:=copy(str,3,6);   
    
    {从str的第3字符开始,截6个字符,作为工号}   
    
    table1.fieldbyname(′日期′).asstring   
    
    :=copy(str,16,2)+′/′+copy(str,18,2)+′/′+copy(str,20,2);   
    
    {从str的第16字符开始,截6个字符,作为日期}   
    
    table1.fieldbyname(′时间′).asstring:=copy(str,22,2)+′:′+copy(str,24,2);   
    
    {从str的第22字符开始,截4个字符,作为时间}   
    
    str:=copy(str,26,1);   
    
    {从str的第26字符开始,截1个字符,作为出勤状态}   
    
    ifstr=′a′thentable1.fieldbyname(′进/出′).asstring:=′进′   
    
    elsetable1.fieldbyname(′进/出′).asstring:=′出′;   
    
    table1.post;{将数据过至kq.db数据库中}   
    
    read(txtfile,ch);{略过换行符}   
    
    str:=′′;{清str变量}   
    
    end;   
    
    end;   
    
    end;   
    
    proceduretform1.button2click(sender:tobject);   
    
    begin   
    
    close;   
    
    end;   
    

#5


是不简单啊,思路我知道,但就是不知道这个代码怎么写,实在是想不出来,所以来求救了啊,希望大侠再次指点迷津...

#6


...太多代码了 还有很多建库方面的问题 建议你直接去书店 找本实例书看看 那种书都带原代码 有些直接 就已经编译好了 感觉在这里肯定是说不清楚的

#7


protected void Button1_Click(object sender, EventArgs e)
    {
        StreamReader sr = new StreamReader(new FileStream(@"C:\test.txt", FileMode.Open, FileAccess.Read), System.Text.Encoding.Default);

        SqlConnection cn = new SqlConnection(""); ;

        string insertCmd = "";
           
        string strTemp = sr.ReadLine();
        while(strTemp != null)
        {            
            SqlCommand cmd =  new SqlCommand(insertCmd, cn);
            
            cmd.Parameters.Add("@A", SqlDbType.VarChar).Value = "";
             cn.Open();
            try
            {
                cmd.ExecuteNonQuery();
            }
            catch(System.Data.SqlClient.SqlException e1)
            {
                Console.WriteLine(e1.Message);
            }
            cn.Close();
            strTemp = sr.ReadLine();
        }
        sr.Close();
    }

#1


SQL的写法,用程序的话得把文本转换成数据集再插入
文本文件和数据表结构得对应。

/** 导入文本文件 
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’ 

#2


小女子?

  /**   导入文本文件   
  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'   
  )   
    
    
  --/*   dBase   IV文件   
  select   *   from     
  OPENROWSET('MICROSOFT.JET.OLEDB.4.0'   
  ,'dBase   IV;HDR=NO;IMEX=2;DATABASE=C:\','select   *   from   [客户资料4.dbf]')   
  --*/   
    
  --/*   dBase   III文件   
  select   *   from     
  OPENROWSET('MICROSOFT.JET.OLEDB.4.0'   
  ,'dBase   III;HDR=NO;IMEX=2;DATABASE=C:\','select   *   from   [客户资料3.dbf]')   
  --*/   
    
    
    
  /*   
    实现数据导入/导出的存储过程   
                    根据不同的参数,可以实现导入/导出整个数据库/单个表   
    调用示例:   
  --导出调用示例   
  ----导出单个表   
  exec   file2table   'zj','','','xzkh_sa..地区资料','c:\zj.txt',1   
  ----导出整个数据库   
  exec   file2table   'zj','','','xzkh_sa','C:\docman',1   
    
  --导入调用示例   
  ----导入单个表   
  exec   file2table   'zj','','','xzkh_sa..地区资料','c:\zj.txt',0   
  ----导入整个数据库   
  exec   file2table   'zj','','','xzkh_sa','C:\docman',0   
    
  */   
  if   exists(select   1   from   sysobjects   where   name='File2Table'   and   objectproperty(id,'IsProcedure')=1)   
    drop   procedure   File2Table   
  go   
  create   procedure   File2Table   
  @servername   varchar(200)         --服务器名   
  ,@username   varchar(200)             --用户名,如果用NT验证方式,则为空''   
  ,@password   varchar(200)             --密码   
  ,@tbname   varchar(500)             --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表   
  ,@filename   varchar(1000)         --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt   
  ,@isout   bit                         --1为导出,0为导入   
  as   
  declare   @sql   varchar(8000)   
    
  if   @tbname   like   '%.%.%'   --如果指定了表名,则直接导出单个表   
  begin   
    set   @sql='bcp   '+@tbname   
        +case   when   @isout=1   then   '   out   '   else   '   in   '   end   
        +'   "'+@filename+'"   /w'   
        +'   /S   '+@servername   
        +case   when   isnull(@username,'')=''   then   ''   else   '   /U   '+@username   end   
        +'   /P   '+isnull(@password,'')   
    exec   master..xp_cmdshell   @sql   
  end   
  else   
  begin     --导出整个数据库,定义游标,取出所有的用户表   
    declare   @m_tbname   varchar(250)   
    if   right(@filename,1)<>'\'   set   @filename=@filename+'\'   
    
    set   @m_tbname='declare   #tb   cursor   for   select   name   from   '+@tbname+'..sysobjects   where   xtype=''U'''   
    exec(@m_tbname)   
    open   #tb   
    fetch   next   from   #tb   into   @m_tbname   
    while   @@fetch_status=0   
    begin   
        set   @sql='bcp   '+@tbname+'..'+@m_tbname   
            +case   when   @isout=1   then   '   out   '   else   '   in   '   end   
            +'   "'+@filename+@m_tbname+'.txt   "   /w'   
            +'   /S   '+@servername   
            +case   when   isnull(@username,'')=''   then   ''   else   '   /U   '+@username   end   
            +'   /P   '+isnull(@password,'')   
        exec   master..xp_cmdshell   @sql   
        fetch   next   from   #tb   into   @m_tbname   
    end   
    close   #tb   
    deallocate   #tb       
  end   
  go   
 

#3


Time=2009-02-24 00:15:24 
Sender=张三 
Receivers=李四,赵六 
Msg=你好 
--------------------------------------------------------------------------- 
Time=2009-02-24 00:16:10 
Sender=王五 
Receivers=赵六 
Msg=你好 
--------------------------------------------------------------------------- 
Time=2009-02-24 00:15:58 
Sender=王五 
Receivers=赵六,李四 
Msg=你好 

这个不好弄啊。
要先把一些无用的信息去掉,
用for 循环 读取每行的数据,放到一个哈希表中。
然后一个取出来,用=分隔,取第二个数作为数值

用循环插入数据库。

#4


参考
给个例子:   
  用delphi将纯文本文件转换成数据库文件     
    在开发数据库应用程序时,有时需要将纯文件格式的文件转换为数据库类型的文件。下面,结合笔者所开发的具体应用实例,来说明这一转换方法。   
    
    笔者所开发的是“人事考勤管理系统”,在这一系统中,需要将考勤刷卡机所生成的员工考勤数据(纯文本格式)转换到paradox5.0格式的数据库中,以便于应用程序对数据库进行统计查询等操作。   
    
    1、下面是考勤刷卡机生成的员工考勤数据文件(文件名为kq.txt)的格式:   
    
    01000315 9801051428a0   
    
    01000820 9801051429a1   
    
    01000659 9801051429b2   
    
    01000883 9801051429b3   
    
    01000173 9801051429a4   
    
    ………   
    
    说明:   
    
    ●每一行为某一员工某一次的刷卡记录数据   
    
    ●行宽固定为27个字符   
    
    ●1~2字符为刷卡机代码:01代表1号刷卡机,02代表2号刷卡机,依此类推   
    
    ●3~15字符为员工考勤工号,共有13位,本系统只用了6位,000315为员工工号   
    
    ●16~25字符为刷卡时间,9801051428意即98年1月5日14点28分   
    
    ●26字符为刷卡状态,a为上班,b为下班   
    
    ●27字符为流水号,0~9为一循环   
    
    2、paradox数据库类型文件kq.db数据库结构如下:   
    
    共有4个字段   
    
    ●工号:字符类型,宽度为6   
    
    ●日期:字符类型,宽度为8   
    
    ●时间:字符类型,宽度为5   
    
    ●进/出:字符类型,宽度为2   
    
    此文件可由数据库桌面database   desktop创建,并保存到c:ιkq子目录中。   
    
    3、从kq.txt到kq.db的转换方法如下:   
    
    (1)建立窗体(如下图所示),设置窗体各控件的属性。   
    
       
    
    此窗体共有两个按钮(button1和button2),一个数据表(table1),一个数据源(datasource1)和一个数据网格(dbgrid1),它们的属性分别如下:   
    
    ●button1.caption:=转换   
    
    ●button2.caption:=退出   
    
    ●table1.databasename:=c:\kq   
    
    table1.tablename:=kq.db   
    
    ●datasource1.dataset:=table1   
    
    ●dbgrid1.datasource:=datasource1   
    
    (2)转换处理程序如下:   
    
    procedure   tform1.button1click(sender:tobject);   
    
    var   
    
    str:string;   
    
    txtfile:textfile;{定义一个文本文件变量txtfile}   
    
    ch:char;   
    
    begin   
    
    table1.open;{打开kq.db数据库}   
    
    assignfile(txtfile,′c:\kq\kq.txt′);{将kq.txt分配给txtfile变量}   
    
    reset(txtfile);{打开kq.txt文本文件}   
    
    str:=′′;   
    
    while   not   eof(txtfile)do{只要kq.txt文件没有结束,就循环转换}   
    
    begin   
    
    read(txtfile,ch);{从kq.txt中读一个字符}   
    
    if   ch<>char(13)then{是否为回车符}   
    
    str:=str+ch{不是回车,继续读下一个字符}   
    
    else   
    
    begin{是回车符,表明已经读完一行,此时str变量即代表一行信息}   
    
    table1.append;{将kq.db数据库追加一空记录}   
    
    table1.edit;{将kq.db数据库设为可编辑}   
    
    table1.fieldbyname(′工号′).asstring:=copy(str,3,6);   
    
    {从str的第3字符开始,截6个字符,作为工号}   
    
    table1.fieldbyname(′日期′).asstring   
    
    :=copy(str,16,2)+′/′+copy(str,18,2)+′/′+copy(str,20,2);   
    
    {从str的第16字符开始,截6个字符,作为日期}   
    
    table1.fieldbyname(′时间′).asstring:=copy(str,22,2)+′:′+copy(str,24,2);   
    
    {从str的第22字符开始,截4个字符,作为时间}   
    
    str:=copy(str,26,1);   
    
    {从str的第26字符开始,截1个字符,作为出勤状态}   
    
    ifstr=′a′thentable1.fieldbyname(′进/出′).asstring:=′进′   
    
    elsetable1.fieldbyname(′进/出′).asstring:=′出′;   
    
    table1.post;{将数据过至kq.db数据库中}   
    
    read(txtfile,ch);{略过换行符}   
    
    str:=′′;{清str变量}   
    
    end;   
    
    end;   
    
    end;   
    
    proceduretform1.button2click(sender:tobject);   
    
    begin   
    
    close;   
    
    end;   
    

#5


是不简单啊,思路我知道,但就是不知道这个代码怎么写,实在是想不出来,所以来求救了啊,希望大侠再次指点迷津...

#6


...太多代码了 还有很多建库方面的问题 建议你直接去书店 找本实例书看看 那种书都带原代码 有些直接 就已经编译好了 感觉在这里肯定是说不清楚的

#7


protected void Button1_Click(object sender, EventArgs e)
    {
        StreamReader sr = new StreamReader(new FileStream(@"C:\test.txt", FileMode.Open, FileAccess.Read), System.Text.Encoding.Default);

        SqlConnection cn = new SqlConnection(""); ;

        string insertCmd = "";
           
        string strTemp = sr.ReadLine();
        while(strTemp != null)
        {            
            SqlCommand cmd =  new SqlCommand(insertCmd, cn);
            
            cmd.Parameters.Add("@A", SqlDbType.VarChar).Value = "";
             cn.Open();
            try
            {
                cmd.ExecuteNonQuery();
            }
            catch(System.Data.SqlClient.SqlException e1)
            {
                Console.WriteLine(e1.Message);
            }
            cn.Close();
            strTemp = sr.ReadLine();
        }
        sr.Close();
    }