c# winform读取文本文件并导入SQL数据库 在线等

silencepen 2010-07-22 04:37:55
文本文件为带空格分隔符的文件
色号 颜色名称
11 红色
12 黄色
13 蓝色
14 大红色
下面是代码,我只写了上半段,请哪位高手指点.详细给出代码
private void btnIn_Click(object sender, EventArgs e)
{
openFileDialog1.InitialDirectory="c:\\"; //定义openFileDialog默认打开路径
openFileDialog1.Filter = "文本文件|*.txt";
openFileDialog1.ShowDialog();
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
string txt_str;
string fname;
fname = openFileDialog1.FileName.ToString();
FileStream fs;
fs = new FileStream(fname, FileMode.OpenOrCreate);
StreamReader sr = new StreamReader(fs);
StringBuilder str = new StringBuilder();
string strline;
while ((strline=sr.ReadLine())!=null)
{

}

}
...全文
830 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
henrybabyj 2012-07-18
  • 打赏
  • 举报
回复
4楼应注明出处……
oneatree 2011-08-03
  • 打赏
  • 举报
回复
mark
蝶恋花雨 2011-08-03
  • 打赏
  • 举报
回复
 //如何在textbox里显示txt文件的内容   
04. string path = @"D:/test.txt";//读取文件txt
06. using (FileStream fs = new FileStream(path, FileMode.Open))
07. {
08. using (StreamReader sr = new StreamReader(fs))
09. {
10. while (!sr.EndOfStream)
11. {
12. string sLine = sr.ReadLine();
13. if (sLine.Length < 1)
14. {
15. continue;
16. }
17. string[] sRecordKbn = sLine.split(' ');//过滤空格
18. forach(string s in sRecordKbn )
{
//s是取出的数据。你可以插入数据库
}
}
21. }
22. }
23.

你看着改呗。
zhangyange 2011-08-03
  • 打赏
  • 举报
回复
二:初步的解决思路和步骤
1:读取文本文件内容到数据流StreamReader
2:开始事务
3:循环从数据流中读取每一行到字符串,按表结构定义通过SubString函数对字符串进行截取到每一个字段变量。
4:定义SQL存储过程,传入步骤3中的每个字段值,在存储过程中完成每条记录的插入!
5:执行事务
6:事务回滚
7:错误消息捕捉,返回友好信息提示
8:释放相关资源

三:实际开发中出现的问题与解决方法
问题:
实际的程序中,按照文本文件定义的字段长度进行字符串截取,取出来的字符串长度与实际长度不一致,不论是使用bg2312编码还是默认编码。 具体现象通过调试跟踪,在C#中,不论是英文字母还是汉字,取出来的长度也是1,而不是如文本文件中规定的那样,汉字长度为2.导致整个字符串与实际定义的长度不一致,所以在用SubString()函数截取字符串时,无法根据数据结构定义中的长度正确取得每个字段值。
原因分析:
问题原因很明显是编码格式出现问题,汉字保存在磁盘中的编码有多种,常见的有:GB、BIG5 、Unicode、UTF-7、UTF-8等。在文本文件读取过程中, 文件的编码(Encoding)和StreamReader/Writer指定的Encoding不对应,就会出现乱码问题。虽然StreamReader可以根据文本文件格式自动识别编码格 式,正确读取不同编码格式的文本文件。但对于字符串来说,是无法识别字符串中的中文字符与英文,数字的区别,统一都作用长度为1处理。正确的处 理方法是使用将字符串转换为字节数组,对字节数组按文本文件定义的字段长度读取每个字段值。

四:修正的解决思路
1:读取文本文件内容到数据流StreamReader
2:开始事务
3:循环从数据流中读取每一行到字符串,并转换为字节数组。按表结构定义对字节数组进行截取到每一个字段变量。
4:定义SQL存储过程,传入步骤3中的每个字段值,在存储过程中完成每条记录的插入!
5:执行事务
6:事务回滚
7:错误消息捕捉,返回友好信息提示
8:释放相关资源


五:相关的文本文件处理函数参考,完整的源码见附件


/// <summary>
/// 通用函数,读文本文件
/// </summary>
/// <param name="fileName">读入的文本文件名称</param>
public static void ReadTextFromFileName(string fileName)
{
string strRecord = "";

//读入文本文件时,一定要指定文件的编码格式.其中:default为文本文件本来的编码格式
//如果是简体中文的文本文件,也可以这样设置编码格式: System.Text.Encoding.GetEncode("gb2312")
//Encoding.GetEncode("gb2312")为简体中文编码格式,Encoding.GetEncode("big5")为繁体中文编码格式.
StreamReader reader = new StreamReader(fileName,System.Text.Encoding.Default);

da = new DataAccess();
da.OpenConnection();

//指定本次数据操作进行事务处理
da.StartTrans = true;

//开始事务处理
da.BeginTrans();

//i is the really row
//j is the row of writed to database
int i ,j;
i=0;
j=0;
try
{
while (reader.Peek() >= 0)
{
strRecord = reader.ReadLine();
if (StringConvertByteArray(strRecord))
{
j++;
}
i++;
}

//执行事务
da.Commit();

TotalLine = i;
RealLine = j;
}
catch (Exception ex)
{
//事务回滚
da.Rollback();


SystemError.SystemLog("文件:" + fileName +"导入失败,错误行是第"+ i.ToString()+ "行,原因是: " + ex.Message);
throw new Exception(ex.Message);
}

//相关资源的消除
finally
{
reader.Close();
da.CloseConnection();
}
}


/// <summary>
/// 处理定长文本文件的函数,将字符串转换成byte[]数组
/// </summary>
/// <param name="aRecord"></param>
private static bool StringConvertByteArray(string aRecord)
{
//解决文本文件一行中可能存在中文的情况,将string类型转换为byte[]来达到
//正确处理文本文件的目的
byte[] repRecord = System.Text.Encoding.Default.GetBytes(aRecord);

//判断取得的文本文件长度是否等于定义的文本文件长度
if (repRecord.Length != iLineLength)
{
SystemError.SystemLog("文件:" + fileName +"导入出错,出错原因是文件长度不符合");
throw new Exception("文件文本长度不对,导入失败,请检查文件文件格式");
}

bool isInsert=false;
isInsert = AddRecord(
GetString(repRecord,0,8),
GetString(repRecord,8,8),
GetString(repRecord,16,6),
GetString(repRecord,22,6),
GetString(repRecord,28,8),
GetString(repRecord,36,6),
GetString(repRecord,42,10),
GetString(repRecord,52,4),
GetString(repRecord,56,6),
GetString(repRecord,62,8),
GetString(repRecord,70,7),
GetString(repRecord,77,32),
GetString(repRecord,109,72),
GetString(repRecord,181,8),
GetString(repRecord,189,30),
GetString(repRecord,219,45),
GetString(repRecord,264,10),
GetString(repRecord,274,25),
GetString(repRecord,299,2),
GetString(repRecord,301,25),
GetString(repRecord,326,3),
GetString(repRecord,329,15),
GetString(repRecord,344,1),
GetString(repRecord,345,8),
GetString(repRecord,353,6),
GetString(repRecord,359,8),
GetString(repRecord,367,1),
GetString(repRecord,368,1),
GetString(repRecord,369,32),
GetString(repRecord,401,7),
GetString(repRecord,408,60),
GetString(repRecord,468,20),
GetString(repRecord,488,20),
GetString(repRecord,508,20),
GetString(repRecord,528,36),
GetString(repRecord,564,15),
GetString(repRecord,579,15),
GetString(repRecord,594,15)
);
return isInsert;

}


//private static void
/// <summary>
/// 处理长度固定的文本文,读取到每个字段的值
/// </summary>
/// <param name="aStr">文本文件的每行文本转换的Byte数组</param>
/// <param name="iStart">读取的起始位置</param>
/// <param name="iLength">读取的长度</param>
/// <returns>返回的字符串,对应于具体的字段值</returns>
private static string GetString(byte[] aStr,int iStart,int iLength)
{

byte[] tempStr = new byte[iLength];
for ( int i = 0; i < iLength; i ++)
{
tempStr[i] = (byte)aStr.GetValue(iStart + i);
}

return System.Text.Encoding.Default.GetString(tempStr);
}

事理 2010-07-22
  • 打赏
  • 举报
回复
http://download.csdn.net/source/2052345已经实现了。
loveSoftandhxy 2010-07-22
  • 打赏
  • 举报
回复
格式设定好。
直接导入数据库中:
string sql = @"EXEC master..xp_cmdshell 'bcp XQ_Environment_mis.dbo.TB_realdata in c:\RealData\RealDt.txt -c -t ""|"" -q -S""127.0.0.1"" -U""sa"" -P""123456""'";

这样不行吗?
my_huohu 2010-07-22
  • 打赏
  • 举报
回复
关注中

110,525

社区成员

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

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

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