"> آموزش خواندن فایل متنی در ASP.NET

آموزش خواندن فایل متنی در ASP.NET

خواندن فایل در ASP.NET

هربار که نیاز به کار با محتوای فایل متنی در ASP.NET داشته ام همواره در فکر این بوده ام که از چندین متد static در کلاس System.IO.File استفاده کنم تا متون را استخراج کرده و سپس برای تجزیه ی محتوا به نوعی ساختار مشخص ، رشته ها یا عبارات منظم آنها را دستکاری میکنم. در همین حال کلاس TextFieldParser که خودش را در اسمبلی Microsoft.VisualBasic پنهان کرده است ، به یاد می آورم. هدف در این مقاله معرفی این Component به شما و همچنین خواندن فایل متنی در ASP.NET است …

فایل متنی در ASP.NET

کتابخانه ی Microsoft.VisualBasic کالکشنی از فضای نام هایی است که شامل Component ها و خدمات متنوعی هستند. اکثر آنها برای برنامه نویسان VB6 یا چیز هایی که برای آنها آشنا است همانند پیاده سازی رشته های مرتبط متد های چپ و راست در .NET ؛ ارائه میشود. اما با وجود نام آنها ، کتابخانه کد های .NET خالص است و میتواند برای هر زبان .NET استفاده میشود. پروژه های سی شارپ شامل مرجعی به Microsoft.VisualBasic به صورت پیش فرض نیستند. پس باید از Add Refrences برای افزودن آن استفاده کنید:

خواندن فایل در ASP.NET

یک نمونه ی TextFieldParser میتواند از یکی از منابع مقداردهی اولیه شود : Stream ، یک فایل فیزیکی بر روی دیسک ، یا یک TextReader. دو مورد اول بیشتر در برنامه های ASP.NET مورد استفاده است. در این مثال اول با هم نحوه ی ایجاد یک TextFieldParser از یک فایل آپلود شده در یک برنامه ی MVC را میبینیم :

[HttpPost]
public ActionResult Index(HttpPostedFileBase file)
{
    if (file != null)
    {
        if (file.ContentLength > 0)
        {
            using (var parser = new TextFieldParser(file.InputStream))
            {
                // ...
            }
        }
    }
    return View();
}

TextFieldParser با یک بلوک using نمونه سازی میشود زیرا این ابزار IDisposable است و بلوک using اطمینان حاصل میکند که شئ به صورت امن و مطمئن displosed میشود. در مثال بعدی میبینیم که مسیر یک فایل به ساختار TextFieldParser پاس داده شده است :

var file = @"C:\test.csv";
using (var parser = new TextFieldParser(file))
{
    //..
}

و در نهایت مثالی از ساختاری که یک اجرای واقعی از TextReader را میپذیرد :

var csv = @"1,Mike,Brind,www.mikesdotnetting.com";
using (var parser = new TextFieldParser(new StringReader(csv)))
{
    // ...
}

 

پیکربندی

گزینه های پیکربندی از طریق خصوصیات و متد ها تنظیم میشود. ویژگی های گزینه های کلید در زیر آورده شده است :

Option Description Default
Delimiters (property) مشخص کننده ی زمینه ی جداکننده استفاده شده در فایل های متنی است. null
SetDelimiters (method) روشی جایگزین برای مشخص کردن زمینه ی جداکننده استفاده شده در فایل های متنی  
TextFieldType (property) مشخص کننده ی اینکه آیا فایل دارای جداکننده است یا با عرض ثابت ؟ TextFieldType.Delimited
HasFieldsEnclosedInQuotes (property) بولین نشان دهنده ی اینکه آیا فایل متنی در کوتیشن بسته شده قرار دارد یا خیر ؟ true
FieldWidths (property) آرایه ای از اعداد صحیح که مشخص کننده ی پهنای زمینه های فردی در یک فایل با پهنای ثابت است null
SetFieldWidths (method) روش دیگری برای مشخص کردن پهنای زمینه های فردی در یک فایل با پهنای ثابت است  
CommentTokens (property) آرایه ی مشخص کننده ی نشانه های استفاده شده برای نشان دادن نظرات یک فایل null
TrimWhiteSpace (property) بولین نشان دهنده ی این که آیا فضا های سفید عقب و جلو در یک زمینه حذف شده اند یا خیر ؟

با نمونه سازی و پیکربندی یک TextFieldParser آماده ی دریافت داده در فایل متنی خود هستید. Parser دارای یک متد ReadFields است که محتوای یک خط را در یک زمان . این یک آرایه ای از رشته ها را برمیگرداند. همچنین دارای یک خاصیت EndOfData است که نشان دهنده ی این است که آیا خط های بیشتری از داده ها برای خوانده شدن وجود دارند یا خیر؟ قطعه کد زیر نشان میدهد که چگونه میتوان از ترکیب این خاصیت و متد برای خواندن هر خط در یک مثال ساده استفاده کرد :

var data = @"1,Potato,Vegetable
۲,Strawberry,Fruit
۳,Carrot,Vegetable
۴,Milk,Dairy,
۵,Apple,Fruit
۶,Bread,Cereal";

using (var parser = new TextFieldParser(new StringReader(data)))
{
    parser.Delimiters = new[] { "," };
    while (!parser.EndOfData)
    {
        var row = parser.ReadFields();
        var foodType = row[2];
    }
}

 

نمونه ی بالا دارای header نیست. مثال زیر همان نمونه بالا به همراه سطری برای header است و نشانگر اینکه چگونه همه چیز را در یک DataTable کپی کنیم :

var data = @"Id,Food,FoodType
۱,Potato,Vegetable
۲,Strawberry,Fruit
۳,Carrot,Vegetable
۴,Milk,Dairy,
۵,Apple,Fruit
۶,Bread,Cereal";

using (var parser = new TextFieldParser(new StringReader(data)))
{
    var headerRow = true;
    var dt = new DataTable();

    parser.Delimiters = new[] { "," };
    
    while (!parser.EndOfData)
    {
        var currentRow = parser.ReadFields();
        if (headerRow)
        {
            foreach (var field in currentRow)
            {
                dt.Columns.Add(field, typeof(object));
            }
            headerRow = false;
        }
        else
        {
            dt.Rows.Add(currentRow);
        }
    }
}

 

مثال نهایی نشان میدهد که چگونه خاصیت CommentTokens را تایید کنیم تا قادر باشیم که یک فایل IIS log استاندارد را درون DataTable بخوانیم ، جایی که خطوط نظرات با استفاده از یک hash (#) در ابتدایشان مشخص شده اند :

خواندن فایل در ASP.NET

var file = @"C:\Logs\W3SVC6\ex140210.log";
var commentTokens = new[] { "#" };
var headerRow = File.ReadAllLines(file).First(l => l.StartsWith("#Fields:"));
using (var parser = new TextFieldParser(file))
{
    var dt = new DataTable();
    var columns = headerRow.Replace("#Fields: ", string.Empty).Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    foreach (var column in columns)
    {
        dt.Columns.Add(column, typeof(object));
    }
    parser.SetDelimiters(" ");
    parser.CommentTokens = commentTokens;
    while (!parser.EndOfData)
    {
        {
            dt.Rows.Add(parser.ReadFields());
        }
    }
}

 

در این زمینه از آنجایی که parser به نحوی پیکربندی شده است که خطوطی را که شامل Comment Token مشخص شده است را نادیده بگیرد. مقداری کد بیشتر نیز برای استخراج زمینه ی header برای ستون نام های DataTable مورد نیاز است.

جمع بندی

به خاطر داشته باشید که اگر دفعه ی بعدی احتیاج به تجزیه ی یک فایل متنی در یک برنامه ی ASP.NET را داشتید ، میتوانید استفاده از TextFieldParser در کتابخانه ی Microsoft.VisualBasic را مد نظر داشته باشید.

موفق باشید !

  • پسورد: www.mspsoft.com
داریوش فرخی

داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

کدیشن ! مارکت پروژه های برنامه نویسی راه اندازی شدیه توکه پا بریم ببینم