怎样用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实例详解(转)

作者:安静平和 字体:[增加 减小] 类型:转载 时间:2015-02-02 我要评论

这篇文章主要介绍了C#处理文本文件TXT的方法,以实例形式详细分析了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文件内容并修改的主要内容,如果未能解决你的问题,请参考以下文章

如何在html中读取txt内容并修改后存入txt内

c#修改文件内容

怎样用fstream对二进制文件进行内容修改和删除?

C# 读取TXT文件内容到listview

python怎样读取txt文件的数据内容

java读取并修改文件