怎样用C#读取TXT文件内容并修改

比如说我现在有一个TXT文件,内容如下:XXX学校XXX班级期末考试成绩————————————————————序号姓名籍贯名次语文英语数学1小明北京19088932小红... 比如说我现在有一个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格式文件
应该怎样做?新手,请高手不吝赐教~谢谢
请详细点回答,最好有完整代码带注释,本人新手!谢谢~~~
展开
 我来答
雨月蓝
2012-02-24 · TA获得超过765个赞
知道小有建树答主
回答量:194
采纳率:100%
帮助的人:248万
展开全部
使用如下代码请确保你的文本文件满足以下条件
文字之间空白的部分为 多个空格,并非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");
jingxiong12345
2012-02-23 · TA获得超过536个赞
知道小有建树答主
回答量:1252
采纳率:0%
帮助的人:638万
展开全部
#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

这个是我做的例子 你可以参考
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友7299dc88a
2012-02-23
知道答主
回答量:11
采纳率:0%
帮助的人:1.8万
展开全部
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 = "成功导入考生成绩信息";
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式