C#如何读取.TXT文件

本文介绍了一种将TXT文件中的数据读取并批量导入到数据库的方法。通过使用StreamReader逐行读取文件,并按逗号分隔字段,最终利用SQL语句实现数据的持久化存储。

我想上传一文件,在上传过程中读取其中的数据,并将其写入数据库中?   
   (就是在客户端(IE),让用户上传一txt文件,将其的数据倒入数据库中)   
   形如以下的.txt文档:   
    
   10001,王      强,3500,,   
   10002,李小华,4000,,   
   10003,王崇文,3500,,   
   10004,姚      敏,5000,,

1楼

这个问题用二进制流肯定不行。   
   上传后,实例化一个streamreader,然后读取,最后保存倒一个数组中。   
   dim    reader    as    new    streamreader(file.opentext(filepath,accessmod))   
   dim    strContent    as    string=reader.readtoend()   
   dim    arryContent()as    string=strContent.split(",")   
   往下楼主应该明白了,数组里保存得是用逗号格开得   
   ,如果你一组数据是一行,那就用reader.readline(),应该是这个东西!然后循环保存。   
   数组数据做参数。


2楼

private    void    Page_Load(object    sender,    System.EventArgs    e)   
   {   
   //    在此处放置用户代码以初始化页面   
   if(Request.RequestType=="POST")   
   {   
   if(this.UpFile.PostedFile.ContentLength>0)   
   {   
   int    Pos    =    UpFile.PostedFile.FileName.LastIndexOf("//")+1;   
   FileName    =    UpFile.PostedFile.FileName.Substring(Pos);   
   FilePath="../"    +    FileName;   
   UpFile.PostedFile.SaveAs(Server.MapPath(FilePath));   
           UpFile.PostedFile.InputStream.Close();   
           ReadFile(Server.MapPath(FilePath));   
        
    
                                
   }   
   else   
   {   
   Response.Write("<script    language='Javascript'>alert('请选择要上传的文件!');history.go(-1);</script>");   
   Response.End();   
    
   }   
   }   
   }


3楼

楼上的代码是先上传文件,然后读取文件   
   private    bool    existedName(string    usercode)   
   {   
   dc.refConn(ref    dbconn);   
   dbconn.Open();   
   string    sel="select    count(*)    from    tab_xx    where    usercode='"+usercode+"'";   
    
   SqlCommand    sc=new    SqlCommand(sel,dbconn);   
   int    ck=(int)sc.ExecuteScalar();   
                             dbconn.Close();   
   if(ck>0)   
   {   
   return    true;   
   }   
   return    false;   
    
   }   
    
   这是判断数据库是否已存在记录


4楼

private    void    ReadFile(string    path)   
   {   
   if(System.IO.File.Exists(path))   
   {   
   StreamReader    reader=new    StreamReader(path,System.Text.Encoding.GetEncoding("GB2312"));   
    
   reader.ReadLine();   
   string    oneline;   
   while((oneline    =reader.ReadLine())    !=    null)   
   {   
   oneline=oneline.Trim();   
   if(oneline    !=    "")   
   {   
   string    []    ss=oneline.Split(",".ToCharArray());   
   if(!existedName(ss[0].ToString()))   
   {   
   StringBuilder    sb=new    StringBuilder();   
   sb.Append("insert    into    tab_adminuser    values(");   
   for(int    i=0;i<ss.Length;i++)   
   {   
   sb.Append("'"+ss[i]+"'"+",");   
    
   }   
   sb.Append("'3,'");   
   // sb.Remove(sb.ToString().LastIndexOf(","),1);   
    
   sb.Append(")");   
   // Response.Write(sb.ToString());   
   // Response.End();   
   dc.exeSQL(sb.ToString());   
   }   
    
    
   }   
   }   
   reader.Close();//记得要关闭输入输出流   
    
   }   
   else   
   {   
   Response.Write("<script    language='javascript'>alert('指定的文件不存在!');history.go(-1);</script>");   
   Response.End();   
   }   
   }   
    
   这个函数是读取文件


5楼

zhanqiangz(闲云野鹤)    正解,我做个和这个差不多的一个上传txt文件写如数据库的,也是这样处理。   
   streamreader    sr;   
   sr    =    File.OpenText(filename);   
   while    ((input=sr.ReadLine())!=null)     
   {   
             string[]    col=input.Split(',');   
             //这个时候col里面的东西应该有你需要的值了             
   }   
   这样循环一行行读,应该ok


6楼

  
   上传后,实例化一个streamreader,然后读取,最后保存倒一个数组中。   
   dim    reader    as    new    streamreader(file.opentext(filepath,accessmod))   
   dim    strContent    as    string=reader.readtoend()   
   dim    arryContent()as    string=strContent.split(",")   
   往下楼主应该明白了,数组里保存得是用逗号格开得   
   ,如果你一组数据是一行,那就用reader.readline(),应该是这个东西!然后循环保存。   
   数组数据做参数。


7楼

谢谢各位!   
   to:zhanqiangz(闲云野鹤)   
   ss[i]是否就是我需写入数据库的值?   
   可否简单注释一下最后一段代码,谢谢!   
    
   private    void    ReadFile(string    path)   
   {   
   if(System.IO.File.Exists(path))   
   {   
   StreamReader    reader=new    StreamReader(path,System.Text.Encoding.GetEncoding("GB2312"));   
    
   reader.ReadLine();   
   string    oneline;   
   while((oneline    =reader.ReadLine())    !=    null)   
   {   
   oneline=oneline.Trim();   
   if(oneline    !=    "")   
   {   
   string    []    ss=oneline.Split(",".ToCharArray());   
   if(!existedName(ss[0].ToString()))   
   {   
   StringBuilder    sb=new    StringBuilder();   
   sb.Append("insert    into    tab_adminuser    values(");   
   for(int    i=0;i<ss.Length;i++)   
   {   
   sb.Append("'"+ss[i]+"'"+",");   
    
   }   
   sb.Append("'3,'");   
   //sb.Remove(sb.ToString().LastIndexOf(","),1);   
    
   sb.Append(")");   
   //Response.Write(sb.ToString());   
   //Response.End();   
   dc.exeSQL(sb.ToString());   
   }   
    
    
   }   
   }   
   reader.Close();//记得要关闭输入输出流   
    
   }   
   else   
   {   
   Response.Write("<script    language='javascript'>alert('指定的文件不存在!');history.go(-1);</script>");   
   Response.End();   
   }   
   }


8楼

比较麻烦   
   用zhanqiangz(闲云野鹤)方法先把数据流读出来   
   然后,再根据您的        ,              /n        这两个符号把你的数据分开   
   然后保存入数据库


9楼

俺只会使用企业管理器导入


10楼

???那段代码是我贴出的,你问错人了吧?


11楼

呵呵!   
   Sorry,    realconnection(龙苗)   
   能注释一下吗?


12楼

private    void    ReadFile(string    path)   
   {   
   if(System.IO.File.Exists(path))//判断指定路径的文件是否存在   
   {   
   StreamReader    reader=new    StreamReader(path,System.Text.Encoding.GetEncoding("GB2312"));   
   //实例化一个StreamReader    ,并且指定编码方式,不然读取中文的时候会出现乱码   
   reader.ReadLine();//先读取一行(如果文件上方没有标题之类的东西,可不要这行代码)   
   string    oneline;   
   while((oneline    =reader.ReadLine())    !=    null)   
   {   
   oneline=oneline.Trim();   
   if(oneline    !=    "")   
   {   
   string    []    ss=oneline.Split(",".ToCharArray());//每行的数据以,隔开,保存在数组里   
   if(!existedName(ss[0].ToString()))    ss[0]是数组第一个元素,以此判断数据库中数据是否存在   
   {   
   StringBuilder    sb=new    StringBuilder();实例化StringBuilder     
   sb.Append("insert    into    tab_adminuser    values(");   
   for(int    i=0;i<ss.Length;i++)   
   {   
   sb.Append("'"+ss[i]+"'"+",");   
    
   }   
   sb.Append("'3,'");//以上几句是构造SQL的插入语句   
   //sb.Remove(sb.ToString().LastIndexOf(","),1);   
    
   sb.Append(")");   
   //Response.Write(sb.ToString());   
   //Response.End();   
   dc.exeSQL(sb.ToString());//执行SQL,DC是我的一个类,作用是完成数据库插入   
   }   
    
    
   }   
   }   
   reader.Close();//记得要关闭输入输出流   
    
   }   
   else   
   {   
   Response.Write("<script    language='javascript'>alert('指定的文件不存在!');history.go(-1);</script>");   
   Response.End();   
   }   
   }   
    
    
   呵呵,其实挺简单的,现在应该没什么不明白的吧   
  


13楼

先试试!
<think> 我们被要求使用C#读取一个txt文件,修改从第104行开始(包括第104行)的所有数据,然后将修改后的内容写回文件。 我们可以采用以下步骤: 1. 读取整个文件到一个字符串数组(每行一个元素)。 2. 因为我们只需要修改第104行及以下,所以我们可以保留前103行不变。 3. 修改第104行及以后的行(根据需求)。 4. 将修改后的全部行(包括未修改的前103行和修改后的行)重新写入文件。 注意:行号从1开始,但数组索引从0开始,所以第104行对应索引103。 但是,用户没有具体说明如何修改104行及以下的数据,所以我们可以提供一个通用的方法框架: - 读取文件的所有行 - 检查文件是否有104行(至少103行,因为索引103是第104行) - 修改从索引103开始的所有行(可以根据具体需求修改每一行,或者替换为新的行列表) - 将修改后的行写回原文件(或另存为新文件) 另外,如果文件非常大,这种方法可能占用较多内存(因为一次性读取所有行),但一般文本文件不会太大。对于大文件,我们可以考虑流式处理,但修改行数不确定且需要覆盖写入,这里一次性读取更为简单。 下面给出一个示例代码,演示如何读取、修改(这里用示例修改:每行后面加上" - modified")和写回文件。 </think> 以下是基于引用内容的 C# 读取和修改文本文件的解决方案,特别针对第 104 行及以下数据的修改需求: ### 解决方案步骤 1. **读取文件**:使用 `File.ReadAllLines()` 将所有行读入数组 2. **定位修改起点**:第 104 行对应数组索引 103(数组从 0 开始) 3. **修改数据**:对指定行及后续行进行修改操作 4. **写入文件**:使用 `File.WriteAllLines()` 覆盖原文件或保存新文件 ```csharp using System; using System.IO; using System.Linq; class TxtFileEditor { static void Main() { string filePath = @"C:\your\file.txt"; // 替换为实际路径 try { // 1. 读取全部行到数组 string[] lines = File.ReadAllLines(filePath); // 2. 检查行数是否足够 if (lines.Length < 104) throw new Exception("文件行数不足104行"); // 3. 修改第104行及以下数据(此处为示例) for (int i = 103; i < lines.Length; i++) { // 示例修改:在每行末尾添加修改标记 lines[i] += " [已修改]"; // 实际应用替换为您需要的修改逻辑 // 例如:lines[i] = newData; } // 4. 重新写入文件(覆盖原文件) File.WriteAllLines(filePath, lines); Console.WriteLine("文件修改成功!"); } catch (Exception ex) { Console.WriteLine($"操作失败: {ex.Message}"); } } } ``` ### 关键说明 1. **行号对应**: - 第 104 行 → 数组索引 `lines[103]` - 修改范围:`i = 103` 到 `lines.Length-1` 2. **修改逻辑定制**: - 替换 `// 示例修改:` 处的代码为您的实际业务逻辑 - 支持复杂操作:正则替换、数据计算、格式转换等 3. **文件处理注意事项**: - 大文件优化:对于超大文件(如日志),改用 `StreamReader` 和 `StreamWriter` 流式处理[^2] - 备份机制:修改前建议创建副本 `File.Copy(filePath, backupPath)` - 编码处理:使用 `Encoding` 参数指定文件编码(如中文需 `Encoding.UTF8`) ### 应用场景示例 - 配置文件批量更新(如引用[1]的INI修改场景) - 日志文件脱敏处理(如引用[2]的日志操作) - 数据文件格式转换 - 批量替换特定内容
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值