关于循环读取txt表内数据到数据库中

问题描述

Hi,各位大神,想实现这样一个逻辑,假设:文件夹内有10个txt文本文档,里面每个对应一个sql内的表,且每个文本文档(以及sql中的表)列数均不同。这边我读取了每个txt的路径。然后每个字段用"|"符号隔开。我想实现每个txt文本文件自动匹配sql里的表,且列也自动匹配,而不是写10个case.每个case需要写几十个columns.add.放在datatable中。有什么好办法吗?privatevoidbutton1_Click(objectsender,EventArgse){DataTabledt=newDataTable();//dt.Columns.Add("a");//dt.Columns.Add("b");//dt.Columns.Add("c");//dt.Columns.Add("d");foreach(stringfilenameinDirectory.GetFiles("D:\InstinctData","*.txt",SearchOption.AllDirectories)){Console.WriteLine(filename);stringstrFilePath=filename;FileStreamfs=newFileStream(strFilePath,FileMode.Open,FileAccess.Read);StreamReadersr=newStreamReader(fs,System.Text.Encoding.Unicode);SqlConnectionconn=newSqlConnection();conn.ConnectionString="DataSource=.;Database=~;Uid=~;Pwd=~";conn.Open();stringstrLine=sr.ReadLine();while(strLine!=null){string[]strArray=newstring[4];strArray=strLine.Split('|');DataRowdr=dt.NewRow();dr[0]=strArray[0];dr[1]=strArray[1];dr[2]=strArray[2];dr[3]=strArray[3];stringsql="insertintoA_Testvalues('"+dr[0]+"','"+dr[1]+"','"+dr[2]+"','"+dr[3]+"')";SqlCommandcmd=newSqlCommand(sql,conn);cmd.ExecuteNonQuery();dt.Rows.Add(dr);strLine=sr.ReadLine();}sr.Close();fs.Close();conn.Close();//stringfilecontent=string.Join("rn",System.IO.File.ReadAllLines(filename));//Console.WriteLine(filecontent);}}求大神给点小代码启发一下。因为这边是insert语句,必须注明列的。。。很困难。或者先把sql表中的列读取到gridview中?然后循环列写在insert语句中??我这边假设有100个columns怎么办?谢谢

解决方案

解决方案二:
省掉你的DataTable,这样就不用纠结了。可以直接写数据库或者建一个Model来承载你的数据。
解决方案三:
引用1楼D56233577的回复:

省掉你的DataTable,这样就不用纠结了。可以直接写数据库或者建一个Model来承载你的数据。

再给点提示吧,比如用什么model,怎么写数据库,谢谢
解决方案四:
如果你txt的文件名包含表名,那么表就能匹配了,如果你txt内容的第一行存字段名,那么列也能匹配。不管多少列,用一个循环来建DataTable,不需要case。
解决方案五:
1、CSVHelper读取成实体集合(看你这描述txt数据格式就是csv格式)2、ORM映射3、循环插入数据库其实说白了就是怎么读,然后ORM怎么来做插入数据库的事情如果txt数据量很大,但要求读取时间又很短的话,那还真必须DataTable,然后通过SqlBulkCopy插入数据库
解决方案六:
引用4楼starfd的回复:

1、CSVHelper读取成实体集合(看你这描述txt数据格式就是csv格式)2、ORM映射3、循环插入数据库其实说白了就是怎么读,然后ORM怎么来做插入数据库的事情如果txt数据量很大,但要求读取时间又很短的话,那还真必须DataTable,然后通过SqlBulkCopy插入数据库

太难了。。。
解决方案七:
引用3楼D56233577的回复:

如果你txt的文件名包含表名,那么表就能匹配了,如果你txt内容的第一行存字段名,那么列也能匹配。不管多少列,用一个循环来建DataTable,不需要case。

能不能给点代码,循环建datatable.谢谢
解决方案八:
用datatable的话表数据量太大很容易内存溢出数据文件要包含表名,数据流方法如下:intiBufferSize=10240;//10mbbyte[]buffer=newbyte[iBufferSize];using(FileStreamstream=newFileStream(argument.FullPath,FileMode.Open,FileAccess.Read)){StreamReaderfileReader=newStreamReader(stream);longiFileSize=stream.Length;intiTotalCount=(int)Math.Ceiling((double)(iFileSize/iBufferSize));string[]strRows;string[]strCells;stringtmpHalfRow="";DataRowdr;intreadBytes;while((readBytes=stream.Read(buffer,0,iBufferSize))>0){stringxx=tmpHalfRow+Encoding.Default.GetString(buffer);strRows=xx.Replace("n","#").Split('#');for(inti=0;i<strRows.Length;i++){if(i==strRows.Length-1){tmpHalfRow=strRows[i];continue;}strCells=strRows[i].Split('|');dr=dt.NewRow();for(intj=0;j<strCells.Length-1;j++){dr[j]=strCells[j];}dt.Rows.Add(dr);}if(dt.Rows.Count>20000||readBytes<iBufferSize){ExportToExcel(dt,rowHeight,splitTimes,outPutName,styleList);dt.Clear();GC.Collect();splitTimes++;}}
解决方案九:
引用4楼starfd的回复:

1、CSVHelper读取成实体集合(看你这描述txt数据格式就是csv格式)2、ORM映射3、循环插入数据库其实说白了就是怎么读,然后ORM怎么来做插入数据库的事情如果txt数据量很大,但要求读取时间又很短的话,那还真必须DataTable,然后通过SqlBulkCopy插入数据库

另外我想到个问题,如果进去datatable都是string形式,那么sqlbulkcopy到数据库表中,可否自动匹配不同的类型,因为表中有很多类型,intnvarchardatetimemoney等等
解决方案十:
sqlbulkcopy是看你的datatable的列类型是否一致的
解决方案十一:
你全部string进去肯定要错的

时间: 2024-09-15 16:08:15

关于循环读取txt表内数据到数据库中的相关文章

【java IO】使用Java输入输出流 读取txt文件内数据,进行拼接后写入到另一个文件中

1 package com.sxd.test.util; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileOutputStream; 8 import java.io.IOException; 9 import java.io.InputStreamRea

asp教程:asp循环读取txt数数据

asp教程:asp循环读取txt数数据 <% Set FS = Server.CreateObject("Scripting.FileSystemObject") Set RS = FS.OpenTextFile(Server.MapPath("text") & "Tt.txt",1) While not rs.AtEndOfStream       Response.Write RS.ReadLine       Response

C#中读取txt文件列数据并存入int数组中

问题描述 C#中读取txt文件列数据并存入int数组中 我有一个空间绘图的C#程序,txt文件中有三列点的坐标,每行数据由空格隔开,现在需要定义三个x,y,z 一维int数组并将txt文件中列数据赋给x,y,z,txt数据量很大,可能有上千组,希望能够得到代码并在程序中直接调用x[i],y[i],z[i] 解决方案 streamreader一行行读取,然后split按空格分割为数组,你就可以操作数组,转化为你要的数据了 解决方案二: 一行代码就够了: var data = File.ReadAl

用vc++或java每隔一段时间读取一个日志文件(这是一个电话语音接听日志文件,文件内容在随时的增加)后提取有效数据到数据库中

问题描述 用vc++或java每隔一段时间读取一个日志文件(这是一个电话语音接听日志文件,文件内容在随时的增加)后提取有效数据到数据库中,怎么做到从上次读取文件的位置,也就是行数,开始下次的读取.大家知道,java和vc++是通过while()循环来读取文件,我当时的做法是记录上次while()的循环次数,下次读取时先空循环上次记录的行数,然后开始真正的读取文件.看看大伙有没有更好的办法. 解决方案 解决方案二:randomaccessfile+上次读取位置解决方案三:引用1楼inhibitor

架构师-请问如何读取仪器里的数据到数据库?

问题描述 请问如何读取仪器里的数据到数据库? 好像是需要DLL文件吧? 好像是需要DLL文件吧? 好像是需要DLL文件吧? 好像是需要DLL文件吧? 解决方案 参考仪器的开发人员手册 与设备通信是设备厂商考虑的,而不是开发人员考虑的,只需要调用厂商提供的接口即可

java读取excel2013版的内容并把读取出来的内容插入到数据库中

问题描述 java读取excel2013版的内容并把读取出来的内容插入到数据库中 想用java代码读取excel(2013)表格里的内容,但是excel里面有好几个sheet,还有好几个表,该怎么办,而且还要把读取出来的内容储存到数据库中去,求大神帮助 解决方案 public static List<String[]> readExcel(String filePath) { try { List<String[]> list = new ArrayList<String[]

server-用C#代码写一个数据库导入系统,只是将excel表导入到SQL2008数据库中

问题描述 用C#代码写一个数据库导入系统,只是将excel表导入到SQL2008数据库中 用C#代码写一个数据库导入系统,只是将excel表导入到SQL2008数据库中, 我用的是offices 2010 前台是一个fileupload控件,一个button控件,选择excel文件,点击button按钮,直接把excel表中的内容导入到SQL数据库中.请问怎么实现这个功能?详细一些,谢谢 解决方案 建议你建两个数据库连接,一个连接excel,一个连接sql2008,然后把excel里数据取出来,

flex+java选择本地文件然后读取文件内容并导入到数据库中,怎么实现啊,求高手指点,,

问题描述 flex+java选择本地文件然后读取文件内容并导入到数据库中,怎么实现啊,求高手指点,,需要实现的功能是:选择本地文件txt或xls的,然后把文件内容导入数据库中,, 解决方案 解决方案二:问错版块了解决方案三:引用1楼p2227的回复: 问错版块了 !!!!!!那应该算哪个版块的,java+flex解决方案四:flex有个块的http://forum.csdn.net/SList/Flex/java一个大版块了,你展开再自己决定啰

实现通过jsp读取文件内容并保存到数据库中

问题描述 通过jsp读取文件内容并保存到数据库中要读取的文件格式文.txt或者Excel都可以!jsp页面怎么写?如何实现?还有Java代码 解决方案 解决方案二:通过jsp读取文件内容并保存到数据库中要读取的文件格式文.txt或者Excel都可以!jsp页面怎么写?如何实现?还有Java代码解决方案三:建议:页面jsp做成上传文件,后台用流读取文件,将内容存储到数据库.注意:文件内容的大小与数据库字段的大小