怎样用C#读取TXT文件内容并修改
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样用C#读取TXT文件内容并修改相关的知识,希望对你有一定的参考价值。
比如说我现在有一个TXT文件,内容如下:
XXX学校
XXX班级
期末考试成绩
————————————————————
序号 姓名 籍贯 名次 语文 英语 数学
1 小明 北京 1 90 88 93
2 小红 南京 2 89 90 90
3 小龙 山东 3 90 87 88
4 小虎 山西 4 87 90 86
……
现在想去掉籍贯和名次,变成如下形式:
XXX学校
XXX班级
期末考试成绩
————————————————————
序号 姓名 语文 英语 数学 平均分
1 小明 90 88 93 90.33
2 小红 89 90 90 89.67
3 小龙 90 87 88 88.33
4 小虎 87 90 86 87.67
……
请注意,要计算一次平均分
修改之后再保存为TXT格式文件
应该怎样做?新手,请高手不吝赐教~谢谢
请详细点回答,最好有完整代码带注释,本人新手!谢谢~~~
文字之间空白的部分为 多个空格,并非tab键(C#编码【\t】)不是请修改相应正则
确定一行为一条数据
如果出现中文乱码请将文本另存为 utf-8 格式
确定字段列的顺序,不是请修改 int[] teble 中的数据
/// <summary>
///
/// </summary>
/// <param name="file">文件路径</param>
/// <param name="num">一个单元格字节数(排版用)</param>
/// <param name="saveFile">保存路径</param>
public void Test(string file, int num, string saveFile)
Regex r = new Regex("\\s+");//正则:多个空格
int[] teble = new int[] 0, 1, 4, 5, 6 ;//需要输出哪些列
List<string[]> listStrs = new List<string[]>();//读取数据集合
FileStream fs = new FileStream(file, FileMode.Open);//打开文件
StreamReader sr = new StreamReader(fs);//读取
bool hasHead = true;//是否有表头
string lineStr;//读取一行临时变量
while (!sr.EndOfStream)
lineStr = sr.ReadLine().Trim();//读取一行并去掉头尾空格
lineStr = r.Replace(lineStr, " ");//将多个空格替换成一个空格
listStrs.Add(lineStr.Split(' '));//根据空格截取成string数组
sr.Close();
fs.Close();
if (listStrs.Count == 0)//如果没有数据则结束方法
return;
fs = new FileStream(saveFile, FileMode.Create);//创建文件,存在则覆盖
StreamWriter sw = new StreamWriter(fs);//写入
string[] strs;//遍历集合,元素临时变量
int value1;//语文
int value2;//英语
int value3;//数学
double value4;//平均分
for (int i = 0; i < listStrs.Count; i++)
strs = listStrs[i];
if (hasHead)//表头
for (int n = 0; n < strs.Length; n++)
if (teble.Contains(n))//如果是输出列,则输出
sw.Write(FillStr(strs[n], num));
sw.Write(FillStr("平均数", num));//在末尾添加一列
sw.WriteLine();//输出换行
hasHead = false;//只处理一次
continue;//结束本次循环,进入下次循环
for (int j = 0; j < strs.Length; j++)//输出列值
if (teble.Contains(j))//如果是输出列,则输出
sw.Write(FillStr(strs[j], num));
value1 = 0;//设定默认值
value2 = 0;
value3 = 0;
//转换分值,如果成功则转,不成功则为默认值
int.TryParse(strs[4], out value1);
int.TryParse(strs[5], out value2);
int.TryParse(strs[6], out value3);
value4 = (value1 + value2 + value3) / 3.0;//计算平均数
sw.Write(FillStr(value4.ToString("F2"), num));//输出并保留两位小数
sw.WriteLine();
sw.Close();
fs.Close();
/// <summary>
/// 填充单元格
/// </summary>
/// <param name="str">字符串</param>
/// <param name="num">字节数(一个汉字及全角符号为2字节,其他为1字节)</param>
/// <returns></returns>
private string FillStr(string str, int num)
int length = Encoding.Default.GetBytes(str).Length;//获取字节数
while (length < num)//末尾叠加空格
str += " ";
length++;
return str;
测试用例:Test("D:\\1.txt", 10, "D:\\2.txt"); 参考技术A #region 测试2
// string path = Application.StartupPath + "../../../A/新建 文本文档 (6).txt";
// //读取文件内容
// FileStream fs = new FileStream(path, FileMode.Open);
// StreamReader sr = new StreamReader(fs, Encoding.UTF8);
// //string textContent = "";
//this.textBox1.Text = sr.ReadToEnd();
// sr.Close();
// fs.Close();
#endregion
这个是我做的例子 你可以参考 参考技术B if ( wjlx.ToLower() == ".txt")
constr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + vsFilePath + ";Extended Properties='text;HDR=Yes;FMT=Delimited;IMEX=1;'";
sqlstr = "select * from " + filename + "#txt";
using (OleDbConnection sourceConnection = new OleDbConnection(constr))
sourceConnection.Open();
OleDbCommand ocomm = new OleDbCommand(sqlstr, sourceConnection);
OleDbDataReader reader = ocomm.ExecuteReader();
using (SqlConnection destinationConnection = new SqlConnection(connectionString))
destinationConnection.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString))
delete();
while (reader.Read())
String sql = "";
sql = "insert into tb_ksryxx(序号,姓名) values ('" + xh() + "','" + reader["B"] +"')";
conn();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
sconn.Close();
try
//GridView1.DataSource = reader;
//GridView1.DataBind();
// Write from the source to the destination.
// bulkCopy.WriteToServer(reader);
catch (Exception ex)
Response.Write("<script language=\"\">window.alert(\"bulkcopy=" + ex.Message.ToString() + "\");</script>");
return;
finally
reader.Close();
Label1.Text = "成功导入考生成绩信息";
C#处理文本文件TXT实例详解(转)
本文实例讲述了C#处理文本文件TXT的方法。分享给大家供大家参考。具体分析如下:
1. 如何读取文本文件内容:
这里介绍的程序中,是把读取的文本文件,用一个richTextBox组件显示出来。要读取文本文件,必须使用到"StreamReader"类,这个类是由名字空间"System.IO"中定义的。通过"StreamReader"类的"ReadLine()"方法,就可以读取打开数据流当前行 的数据了。下面代码实现的功能就是读取"C:\file.txt"并在richTextBox1组件中显示出来:
FileStreamfs=newFileStream("C:\\file.txt",FileMode.Open,FileAccess.Read); StreamReaderm_streamReader=newStreamReader(fs); //使用StreamReader类来读取文件 m_streamReader.BaseStream.Seek(0,SeekOrigin.Begin); //从数据流中读取每一行,直到文件的最后一行,并在richTextBox1中显示出内容 this.richTextBox1.Text=""; stringstrLine=m_streamReader.ReadLine(); while(strLine!=null) { this.richTextBox1.Text+=strLine+"\n"; strLine=m_streamReader.ReadLine(); } //关闭此StreamReader对象 m_streamReader.Close();
2. 如何改变文本文件中数据内容:
下面的程序中,改变文本文件数据内容的功能是通过改变richTextBox1中的内容来实现的,当richTextBox1这的内容改变后,按动"另存为",就把richTextBox1中内容存储到指定的文本文件中了。要想改变文本文件内容,要使用到"StreamWriter"类,这个类 和"StreamReader"一样,都是由"System.IO"名字空间来定义的。通过"StreamWriter"类的"Write()"方 法,就可以轻松实现文本文件内容的更改了。下面代码的功能是:如果"C"盘存在"file.txt",则把richTextBox1中的内容写入 到"file.txt"中,如果不存在,则创建此文件,然后在写入文本数据。
//创建一个文件流,用以写入或者创建一个StreamWriter FileStreamfs=newFileStream("C\\file.txt",FileMode.OpenOrCreate,FileAccess.Write); StreamWriterm_streamWriter=newStreamWriter(fs); m_streamWriter.Flush(); //使用StreamWriter来往文件中写入内容 m_streamWriter.BaseStream.Seek(0,SeekOrigin.Begin); //把richTextBox1中的内容写入文件 m_streamWriter.Write(richTextBox1.Text); //关闭此文件 m_streamWriter.Flush(); m_streamWriter.Close();
从上面这二个代码可以,写入数据比起读取数据要显得容易些。
3. 如何实现打印预览:
打印预览是通过打印预览对话框来实现的,实现对读取得文本文件的打印预览,最为重要的就是要通知打印预览对话框所要预览的文件的内容。下面代码就是把richTextBox1中显示的内容,通过打印预览对话框显示出来:
stringstrText=richTextBox1.Text; StringReadermyReader=newStringReader(strText); PrintPreviewDialogprintPreviewDialog1=newPrintPreviewDialog(); printPreviewDialog1.Document=ThePrintDocument; printPreviewDialog1.FormBorderStyle=FormBorderStyle.Fixed3D; printPreviewDialog1.ShowDialog();
4. 如何打印文件:
在名字空间"System.Drawing.Printing"中定义了一个类"PrintDocument",通过调用此类的"Print"方法就可 以触发在此名字空间中封装的另外一个事件"PrintPage"。在此事件中设定要打印的文档内容,从而实现队文本文件的打印操作。下面代码是调 用"PrintDocument"的"Print"方法,和调用事件"PrintPage"来打印richTextBox1中的内容:
ThePrintDocument.Print();//其中ThePrintDocument是"PrintDocument"类的一个对象
下列代码是设定打印内容即打印richTextBox1中的内容:
floatlinesPerPage=0; floatyPosition=0; intcount=0; floatleftMargin=ev.MarginBounds.Left; floattopMargin=ev.MarginBounds.Top; stringline=null; FontprintFont=richTextBox1.Font; SolidBrushmyBrush=newSolidBrush(Color.Black); //计算每一页打印多少行 linesPerPage=ev.MarginBounds.Height/printFont.GetHeight(ev.Graphics); //重复使用StringReader对象,打印出richTextBox1中的所有内容 while(count<linesPerPage&&((line=myReader.ReadLine())!=null)) { //计算出要打印的下一行所基于页面的位置 yPosition=topMargin+(count*printFont.GetHeight(ev.Graphics)); //打印出richTextBox1中的下一行内容 ev.Graphics.DrawString(line,printFont,myBrush,leftMargin,yPosition,newStringFormat()); count++; } //判断如果还要下一页,则继续打印 if(line!=null) ev.HasMorePages=true; else ev.HasMorePages=false; myBrush.Dispose();
注释:由于在上述的代码中省掉了这些类所对于地名字空间,所以要想成功的编译和运行上述代码,就要在程序头部要导入所使用的名字空间。
希望本文所述对大家的C#程序设计有所帮助。
以上是关于怎样用C#读取TXT文件内容并修改的主要内容,如果未能解决你的问题,请参考以下文章