[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[asp.net+c#]上传tsv文件,不保存,直接分析stream的部分代码

上一篇:[.net]水晶报表输出xls报错。
下一篇:[论坛精华]IT圈子里鬼混,谈谈IT行业的收入和一些生存之道。

添加日期:2005/12/6 16:29:42 快速返回   返回列表 阅读5050次
就是table分隔的数据,每行对应一行数据。
一般都是上传文件,保存起来,然后重新读取文件。
这是我鼓捣的直接分析stream的,省事…………
=========================
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions; 

namespace xxWebProject.yy
{
    /// <summary>
    /// xxx
    /// </summary>
    public class abcd : System.Web.UI.Page
    {
        protected System.Web.UI.HtmlControls.HtmlInputFile txtFile;
        //.....省略若干.....

        private bool bErrorFlg=false;
    
        private void Page_Load(object sender, System.EventArgs e)
        {
            if(!Page.IsPostBack)
            {
                //爱写啥写啥....
            }
        }

        /// <summary>
        /// 上传文件
        /// </summary>
        private void gsbUpload_Click(object sender, System.EventArgs e)
        {
            //文件没有输入。
            if(txtFile.PostedFile.FileName.Trim().Length==0){
                //报错
                return;
            }
            //文件不存在,或者文件内容为空
            if(txtFile.PostedFile.ContentLength==0)
            {
                //报错
                return;
            }

            //文件类型的判断
            string sFileContentType=txtFile.PostedFile.ContentType;
            string sFilextension=System.IO.Path.GetExtension(txtFile.PostedFile.FileName).ToLower();
            
            //如果文件后缀不是.tsv(文件ContentType的判断我没写)
            if(!sFilextension.Equals(".tsv"))
            {
                //报错
                return;
            } 
            
            //取得文件内容
            System.IO.StreamReader sr = new System.IO.StreamReader(
                txtFile.PostedFile.InputStream,System.Text.Encoding.GetEncoding("GB2312"));  //按GB2312的编码读取输入流的数据

            //数据check
            int iLineNumber=0;
            while(sr.Peek()>-1) //如果有数据
            {
                iLineNumber++;
                CheckData(sr.ReadLine(),iLineNumber); //数据check
            }

            //如果check有错误
            if(bErrorFlg)
            {
                sr.BaseStream.Close();
                sr.Close();
                return;
            }
            string sName="xx"; //登录用户名。

            //重新读取数据
            sr.BaseStream.Seek(0,System.IO.SeekOrigin.Begin);  //数据流的指针重新定位到起点
            sr.DiscardBufferedData(); //StreamReader内容清空
            while(sr.Peek()>-1)
            {
                SaveData(sr.ReadLine(),sName); //保存数据
            }
            //close.
            sr.BaseStream.Close(); //数据流关闭
            sr.Close(); //StreamReader 关闭
            
            //进行数据库更新操作...
        }

        /// <summary>
        /// 数据check
        /// </summary>
        /// <param name="sLineData">每行的数据</param>
        /// <param name="iLineNumber">第x行,报错时报出行数</param>
        private void CheckData(string sLineData,int iLineNumber)
        {
            
            if(sLineData.Trim().Length==0)return; //空行忽略
            //Split
            string[] sArray=Regex.Split(sLineData,"\t",RegexOptions.IgnoreCase); //按tab拆分
            if(sArray.Length!=7){ //如果每行不是7列
                //报错
                bErrorFlg=true; 
                return;
            }
            //Trim
            for(int i=0;i<sArray.Length;i++)
            {
                sArray[i]=sArray[i].Trim();
            }

            //这里对需要check的列进行check,出错就把bErrorFlg置为true。
        }

        /// <summary>
        /// 保存数据
        /// </summary>
        /// <param name="sLineData">每行数据</param>
        /// <param name="sName">登录用户名</param>
        private void SaveData(string sLineData,string sName)
        {            
            if(sLineData.Trim().Length==0)return;
            string[] sArray=Regex.Split(sLineData,"\t",RegexOptions.IgnoreCase);
            //Trim
            for(int i=0;i<sArray.Length;i++)
            {
                sArray[i]=sArray[i].Trim();
            }
            //这里进行保存数据的操作,比如保存到datatable
        }
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved