.NET ডেটাবেটে একটি সিএসভি ফাইল কীভাবে পড়বেন


170

আমি কীভাবে একটি সিএসভি ফাইল লোড করতে পারি System.Data.DataTable উপর ভিত্তি করে ডেটাটেবল তৈরি করে ?

নিয়মিত ADO.net কার্যকারিতা কি এটিকে অনুমতি দেয়?


21
এটি কীভাবে সম্ভবত 'অফ টপিক'? এটি একটি নির্দিষ্ট প্রশ্ন এবং 100 জন এটি দরকারী বলে মনে করেন
রায়ান

10
@ রায়ান: সত্যই আমি আপনাকে বলছি ... স্ট্যাক ওভারফ্লো মডারেটররা সাপুড়েদের একটি বীজ। আমার পিছনে ফিরে এসো, স্ট্যাকওভারফ্লো মডারেটরগুলি!
রনি ওভারবি

উত্তর:


89

এখানে একটি দুর্দান্ত শ্রেণি রয়েছে যা ডেটা টেবিলটি তৈরি করতে ডেটার কাঠামো ব্যবহার করে একটি সিএসভি ডেটা একটি ডেটাবেটে অনুলিপি করবে:

ফ্ল্যাট ফাইলগুলির জন্য একটি বহনযোগ্য এবং দক্ষ জেনেরিক পার্সার

এটি কনফিগার করা সহজ এবং ব্যবহারযোগ্য। আমি আপনাকে একবার দেখার জন্য অনুরোধ।


সত্যিই দুর্দান্ত। এটি ডকুমেন্টেশন না পড়েই বাক্সের বাইরে আমার পক্ষে পুরোপুরি কাজ করেছিল worked
স্মার্কিংম্যান

এটি কি সিএসভি ফাইলগুলিতে কাজ করবে যেখানে প্রতিটি সারি আলাদা কাঠামোর হতে পারে? আমার কাছে লগ ইভেন্ট রয়েছে যা বিভিন্ন ধরণের লগড ইভেন্ট সহ একাধিক টেবিলের মধ্যে আলাদা করতে হবে।
gonzobrains

2
@gonzobrains - সম্ভবত না; সিএসভি ফাইলের প্রাথমিক ধারণাটি প্রথম লাইনে নির্দিষ্ট কলাম শিরোনামগুলির একক সেটের ভিত্তিতে একটি আয়তক্ষেত্রাকার তথ্য কাঠামো। আপনি যা দেখতে পেয়েছেন তা আরও জেনেরিক কমা-বিস্মৃত, বৈষম্যযুক্ত ডেটা বলে মনে হচ্ছে, বিভিন্ন ধরণের অবজেক্টের উদাহরণগুলিতে ফাইল থেকে বিশ্লেষণের জন্য আরও পরিশীলিত "ETL" প্রয়োজন (যার মধ্যে বিভিন্ন ডেটাবেলের ডাটাআরও অন্তর্ভুক্ত থাকতে পারে)।
কিথস

93

আমি OleDbসরবরাহকারী ব্যবহার করা হয় । তবে, আপনি যদি সারণীতে সংখ্যাসূচক মানগুলি পড়ছেন তবে এটি সমস্যা হিসাবে পাঠ্য হিসাবে দেখাতে চাইলে এতে সমস্যা রয়েছে। তবে, আপনি একটি schema.iniফাইল তৈরি করে এই সমস্যাটি পেতে পারেন । আমি আমার ব্যবহার পদ্ধতিটি এখানে:

// using System.Data;
// using System.Data.OleDb;
// using System.Globalization;
// using System.IO;

static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader)
{
    string header = isFirstRowHeader ? "Yes" : "No";

    string pathOnly = Path.GetDirectoryName(path);
    string fileName = Path.GetFileName(path);

    string sql = @"SELECT * FROM [" + fileName + "]";

    using(OleDbConnection connection = new OleDbConnection(
              @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + 
              ";Extended Properties=\"Text;HDR=" + header + "\""))
    using(OleDbCommand command = new OleDbCommand(sql, connection))
    using(OleDbDataAdapter adapter = new OleDbDataAdapter(command))
    {
        DataTable dataTable = new DataTable();
        dataTable.Locale = CultureInfo.CurrentCulture;
        adapter.Fill(dataTable);
        return dataTable;
    }
}

ধন্যবাদ, বন্ধু. এটা আমার জন্য সাহায্য করেছে। আমার একটি সিএসভি ফাইল ছিল যাতে কমাগুলি কেবল বিভাজক ছিল না, তারা অনেকগুলি কলামের মানগুলির মধ্যেই ছিল, তাই রেজিটকে সামনে আনার ফলে লাইনটি বিভক্ত হয়ে উঠবে এটাই ছিল চ্যালেঞ্জিং। OleDbProvider স্কিমার সঠিকভাবে অনুমান করেছে।
গ্যালিলিও

বাস্তবায়নটি বোধগম্য হয় তবে আমরা কীভাবে মিশ্র ডেটাযুক্ত কক্ষগুলি ব্যবহার করব। উদাহরণস্বরূপ, 40 সি এবং ইত্যাদি?
GKED

GKED, আপনি যে তথ্যটি সবসময় পড়ছেন তা যদি কলাম এবং প্রকারের একটি প্রত্যাশিত সেট থাকে তবে আপনি একই ফোল্ডারে একটি shema.ini ফাইল রাখতে পারেন যা কলামগুলি সম্পর্কে OleDb সরবরাহকারীর তথ্য বলে। এখানে একটি মাইক্রোসফ্ট নিবন্ধের লিঙ্ক রয়েছে যা ফাইলের কাঠামো কীভাবে করা যায় তার বিশদ সরবরাহ করে। msdn.microsoft.com/en-us/library/…
জিম স্কট

4
যদিও এই উত্তরটি কার্যকর হবে, আমি এর বিরুদ্ধে দৃ .়ভাবে পরামর্শ দেব। আপনি একটি বাহ্যিক নির্ভরতা প্রবর্তন করেছেন যা একই মেশিনে অফিসের অন্যান্য ইনস্টলেশনগুলির সাথে দ্বন্দ্ব করতে পারে (ইনস্টলড সংস্করণগুলির উপর নির্ভর করে আপনার স্থানীয় দেব পরিবেশে এক্সেল ব্যবহার করবেন?)। সেখানে নিউগেট প্যাকেজ রয়েছে (এক্সেলডাটাআডার, সিএসভিহেল্পার) যা আরও দক্ষ, আরও পোর্টেবল উপায়ে এটি করে।
উঃ মারে

1
@ এ। মুররে - আপনার অর্থ কী? এটি System.Data.dll এ বিল্ট ইন ওলেডিবি সরবরাহকারী ব্যবহার করে। আপনার কোনও অতিরিক্ত "ড্রাইভার" ইনস্টল করার দরকার নেই। এবং যদি কোনও উইন্ডোজ ইনস্টলেশন বেসিক জেট ড্রাইভারটি ইনস্টল না করে থাকে তবে আমি আজ এবং যুগে হতবাক হয়ে যাব। এটি 1990 এর সিএসভি ....
পল ইস্টার

40

আমি সেবাস্তিয়ান লরিওনের সিএসভি রিডার ব্যবহার করার সিদ্ধান্ত নিয়েছি ।

জে রিগস পরামর্শটিও একটি দুর্দান্ত সমাধান, তবে অ্যান্ড্রু রিসিংয়ের জেনেরিক পার্সার যে বৈশিষ্ট্যগুলি সরবরাহ করে সেগুলির জন্য আমার কেবলমাত্র প্রয়োজন হয়নি ।

আপডেট 10/25/2010

আমার প্রকল্পে প্রায় দেড় বছর ধরে সেবাস্তিয়ান লরিওনের সিএসভি রিডার ব্যবহার করার পরে , আমি খুঁজে পেয়েছি যে কিছু সিএসভি ফাইল পার্স করার সময় এটি ব্যতিক্রম ছুঁড়ে দেয় যা আমি বিশ্বাস করি যে এটি ভাল তৈরি হয়েছে।

সুতরাং, আমি অ্যান্ড্রু রিসিংয়ের জেনেরিক পার্সারে স্যুইচ করেছি এবং মনে হচ্ছে এটি আরও ভাল করে চলেছে

আপডেট 9/22/2014

আজকাল, আমি বেশিরভাগই সীমিত পাঠ্য পড়তে এই এক্সটেনশন পদ্ধতিটি ব্যবহার করি:

https://github.com/Core-Techs/Common/blob/master/CoreTechs.Common/Text/DelimitedTextExtensions.cs#L22

https://www.nuget.org/packages/CoreTechs.Common/

আপডেট 2/20/2015

উদাহরণ:

var csv = @"Name, Age
Ronnie, 30
Mark, 40
Ace, 50";

TextReader reader = new StringReader(csv);
var table = new DataTable();
using(var it = reader.ReadCsvWithHeader().GetEnumerator())
{

    if (!it.MoveNext()) return;

    foreach (var k in it.Current.Keys)
        table.Columns.Add(k);

    do
    {
        var row = table.NewRow();
        foreach (var k in it.Current.Keys)
            row[k] = it.Current[k];
    
        table.Rows.Add(row);
    
    } while (it.MoveNext());
}

আমি সম্মত হই যে সেবাস্তিয়ান লরিয়ানের সিএসভি পাঠক দুর্দান্ত। আমি এটি ভারী সিএসভি প্রসেসিংয়ের জন্য ব্যবহার করি, তবে আমি অ্যান্ড্রুয়ের রিসিংগুলি ছোট ছোট কাজের জন্যও ব্যবহার করেছি এবং এটি আমার ভালভাবে পরিবেশন করেছে। আনন্দ কর!
জে রিগস

আমি এই ক্লাসগুলি কীভাবে সিএসভিকে ডেটাবেলে লোড করতে ব্যবহার করতে পারি?
মুফ্লিক্স

আমি এটি চেষ্টা করেছিলাম তবে কলামটির নামের পরিবর্তে এটি "বর্তমান.কী" সংগ্রহটি "সিস্টেম.লিনক.ইনিউমারেবল + হিউয়ারসিলিটলিস্টআইট্রেটার` 2 [সিস্টেম.আইন্ট 32, সিস্টেম.চর]" দিয়ে ফিরে আসে। কোন চিন্তা কেন?
user3658298

আপনি কি বহু চরিত্রের সীমানা ব্যবহার করতে পারেন?
রোলগুলি

না, তবে আমি এটি সক্ষম করার কথা ভেবেছিলাম।
রনি ওভারবি

32

আরে এটি 100% কাজ করছে

  public static DataTable ConvertCSVtoDataTable(string strFilePath)
  {
    DataTable dt = new DataTable();
    using (StreamReader sr = new StreamReader(strFilePath))
    {
        string[] headers = sr.ReadLine().Split(',');
        foreach (string header in headers)
        {
            dt.Columns.Add(header);
        }
        while (!sr.EndOfStream)
        {
            string[] rows = sr.ReadLine().Split(',');
            DataRow dr = dt.NewRow();
            for (int i = 0; i < headers.Length; i++)
            {
                dr[i] = rows[i];
            }
            dt.Rows.Add(dr);
        }

    }


    return dt;
   }

সিএসভি চিত্র এখানে চিত্র বর্ণনা লিখুন

ডেটা টেবিল আমদানি করা এখানে চিত্র বর্ণনা লিখুন


7
কেবলমাত্র যখন 100% ইনপুটগুলি CSV ফাইলগুলির মধ্যে সর্বাধিক সহজ হয় (যা আপনার ক্ষেত্রে সত্য হতে পারে)।
রনি ওভারবি

আপনি সঠিক. আপনার কোডেপ্রজেক্ট.com /আর্টিকেলস / ৯২৫৮ / এ -ফাস্ট- সিএসভি- রিডার (লরিয়ন ডেল) ব্যবহার করা উচিত আমি এর কাজটি ভাল করে চেষ্টা করেছি।
শিবম শ্রীবাস্তব

1
আমার উত্তর 2009 থেকে দেখুন
রনি Overby

1
@ শিভামশ্রীবাস্তব আমি শেষ সারিতে ত্রুটি পেয়ে যাচ্ছি আপনি কি সেখানে আছেন তার পরে আপনাকে অন্য যোগাযোগের তথ্য দেবেন
সুনীল আচার্য

যদিও আমি এই সংস্করণটি ঠিক ব্যবহার করি নি, এটি এর ভিত্তিতেই আমি আমার সমস্যাটি সমাধান করেছি। ধন্যবাদ. খুব ভাল কাজ করে।
17

13

আমরা সবসময় Jet.OLEDB ড্রাইভার ব্যবহার করতাম, যতক্ষণ না আমরা 64৪ বিট অ্যাপ্লিকেশনগুলিতে যেতে শুরু করি। মাইক্রোসফ্ট একটি 64 বিট জেট ড্রাইভারকে ছাড়েনি এবং ছাড়বে না। এখানে একটি সহজ সমাধান আমরা নিয়ে এসেছি যার সাথে ফাইল ব্যবহার করুন the CSV ফাইলটি পড়ার এবং পার্স করার জন্য এবং ম্যানুয়ালি একটি ডেটা টেবিল লোড করার জন্য ফাইল R রিডআললাইনস এবং স্ট্রিং pস্প্লিট uses উপরে উল্লিখিত হিসাবে, এটি কলাম মানগুলির মধ্যে একটিতে কমা রয়েছে এমন পরিস্থিতি পরিচালনা করে না। আমরা এটি বেশিরভাগই কাস্টম কনফিগারেশন ফাইলগুলি পড়ার জন্য ব্যবহার করি - সিএসভি ফাইল ব্যবহারের দুর্দান্ত অংশটি হ'ল আমরা সেগুলিকে এক্সলে সম্পাদনা করতে পারি।

string CSVFilePathName = @"C:\test.csv";
string[] Lines = File.ReadAllLines(CSVFilePathName);
string[] Fields;
Fields = Lines[0].Split(new char[] { ',' });
int Cols = Fields.GetLength(0);
DataTable dt = new DataTable();
//1st row must be column names; force lower case to ensure matching later on.
for (int i = 0; i < Cols; i++)
    dt.Columns.Add(Fields[i].ToLower(), typeof(string));
DataRow Row;
for (int i = 1; i < Lines.GetLength(0); i++)
{
    Fields = Lines[i].Split(new char[] { ',' });
    Row = dt.NewRow();
    for (int f = 0; f < Cols; f++)
        Row[f] = Fields[f];
    dt.Rows.Add(Row);
}

8

এই কোডটি আমি এটি ব্যবহার করি তবে আপনার অ্যাপ্লিকেশনগুলিকে অবশ্যই নেট সংস্করণ 3.5 ব্যবহার করা উচিত

private void txtRead_Click(object sender, EventArgs e)
        {
           // var filename = @"d:\shiptest.txt";

            openFileDialog1.InitialDirectory = "d:\\";
            openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            DialogResult result = openFileDialog1.ShowDialog();
            if (result == DialogResult.OK)
            {
                if (openFileDialog1.FileName != "")
                {
                    var reader = ReadAsLines(openFileDialog1.FileName);

                    var data = new DataTable();

                    //this assume the first record is filled with the column names
                    var headers = reader.First().Split(',');
                    foreach (var header in headers)
                    {
                        data.Columns.Add(header);
                    }

                    var records = reader.Skip(1);
                    foreach (var record in records)
                    {
                        data.Rows.Add(record.Split(','));
                    }

                    dgList.DataSource = data;
                }
            }
        }

        static IEnumerable<string> ReadAsLines(string filename)
        {
            using (StreamReader reader = new StreamReader(filename))
                while (!reader.EndOfStream)
                    yield return reader.ReadLine();
        }

এটি আমি যা উপস্থাপন করতে চেয়েছিলাম তা অনেকটাই।
ক্যাপ্টেন কেনপাচি

8

আপনি মাইক্রোসফ্ট.ভিউজুয়ালবাসিক.ফিলিও.টেক্সটফিল্ড পার্সার dll ব্যবহার করে এটি অর্জন করতে পারবেন # #

static void Main()
        {
            string csv_file_path=@"C:\Users\Administrator\Desktop\test.csv";

            DataTable csvData = GetDataTabletFromCSVFile(csv_file_path);

            Console.WriteLine("Rows count:" + csvData.Rows.Count);

            Console.ReadLine();
        }


private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
        {
            DataTable csvData = new DataTable();

            try
            {

            using(TextFieldParser csvReader = new TextFieldParser(csv_file_path))
                {
                    csvReader.SetDelimiters(new string[] { "," });
                    csvReader.HasFieldsEnclosedInQuotes = true;
                    string[] colFields = csvReader.ReadFields();
                    foreach (string column in colFields)
                    {
                        DataColumn datecolumn = new DataColumn(column);
                        datecolumn.AllowDBNull = true;
                        csvData.Columns.Add(datecolumn);
                    }

                    while (!csvReader.EndOfData)
                    {
                        string[] fieldData = csvReader.ReadFields();
                        //Making empty value as null
                        for (int i = 0; i < fieldData.Length; i++)
                        {
                            if (fieldData[i] == "")
                            {
                                fieldData[i] = null;
                            }
                        }
                        csvData.Rows.Add(fieldData);
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return csvData;
        }

দয়া করে সিএসভি প্রসেসিং সহ চাকাটি পুনরায় উদ্ভাবনের চেষ্টা করবেন না। এখানে অনেক দুর্দান্ত ওপেন সোর্স বিকল্প রয়েছে যা খুব শক্তিশালী।
মাইক কোলে

1
ধন্যবাদ ব্র্যাড, এম্বেডড কোটগুলি পরিচালনা করার জন্য টেক্সটফিল্ড পার্সার সম্পর্কিত দরকারী টিপ।
ম্যাটটিপ

3
public class Csv
{
    public static DataTable DataSetGet(string filename, string separatorChar, out List<string> errors)
    {
        errors = new List<string>();
        var table = new DataTable("StringLocalization");
        using (var sr = new StreamReader(filename, Encoding.Default))
        {
            string line;
            var i = 0;
            while (sr.Peek() >= 0)
            {
                try
                {
                    line = sr.ReadLine();
                    if (string.IsNullOrEmpty(line)) continue;
                    var values = line.Split(new[] {separatorChar}, StringSplitOptions.None);
                    var row = table.NewRow();
                    for (var colNum = 0; colNum < values.Length; colNum++)
                    {
                        var value = values[colNum];
                        if (i == 0)
                        {
                            table.Columns.Add(value, typeof (String));
                        }
                        else
                        {
                            row[table.Columns[colNum]] = value;
                        }
                    }
                    if (i != 0) table.Rows.Add(row);
                }
                catch(Exception ex)
                {
                    errors.Add(ex.Message);
                }
                i++;
            }
        }
        return table;
    }
}

3

আমি এই কোডের এই অংশটি জুড়ে এসেছি যা একটি CSV ফাইল পার্স করার জন্য লিনক এবং রেজেক্স ব্যবহার করে। রিফারিং আর্টিকেলটি এখন দেড় বছরেরও বেশি পুরানো, তবে লিনক (এবং রেজেক্স) এর চেয়ে কোনও সিএসভি পার্স করার খুব সুন্দর উপায়টি আসেনি। ক্যাভ্যাটটি হ'ল এখানে প্রয়োগ করা রেজিেক্স কমা সীমিত ফাইলগুলির জন্য (কোটের অভ্যন্তরে কমাগুলি সনাক্ত করবে!) এবং এটি শিরোনামগুলিতে ভাল নাও লাগতে পারে তবে এগুলি কাটিয়ে ওঠার একটি উপায় আছে। শিখর নিন:

Dim lines As String() = System.IO.File.ReadAllLines(strCustomerFile)
Dim pattern As String = ",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))"
Dim r As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(pattern)
Dim custs = From line In lines _
            Let data = r.Split(line) _
                Select New With {.custnmbr = data(0), _
                                 .custname = data(1)}
For Each cust In custs
    strCUSTNMBR = Replace(cust.custnmbr, Chr(34), "")
    strCUSTNAME = Replace(cust.custname, Chr(34), "")
Next

3

আমি সবচেয়ে ভাল বিকল্পটি খুঁজে পেয়েছি এবং এটি সেই সমস্যার সমাধান করে যেখানে আপনার অফিসের বিভিন্ন সংস্করণ ইনস্টল থাকতে পারে এবং 32/64-বিট ইস্যু যেমন চক বেভিট উল্লেখ করেছেন , ফাইলহেল্পার্স হ'ল

এটি নুগেট ব্যবহার করে আপনার প্রকল্পের রেফারেন্সগুলিতে যুক্ত করা যেতে পারে এবং এটি একটি ওয়ান-লাইনারের সমাধান সরবরাহ করে:

CommonEngine.CsvToDataTable(path, "ImportRecord", ',', true);

কমনইঞ্জাইন কি বলতে পারেন? নুগেট একই সাথে নুগেট.কোর। রেফারেন্সে আমি কেবল নিউগেট.কমকে পেয়েছি
সিন্ধু জাম্পানী

এটি আপনার প্রয়োজন ফাইলহেল্পার। আপনার যদি নুগেট থাকে তবে এটিকে নুগেটের সাথে যুক্ত করুন। অন্যথায়, এটি আপনার প্রকল্পের একটি সমাবেশ হিসাবে যুক্ত করুন। কমনইঞ্জাইন ফাইলহেল্পারের অংশ।
নিও

3

আপনারা যারা বাইরের পাঠাগারটি ব্যবহার না করতে চান এবং ওলেডিবি ব্যবহার না করা পছন্দ করেন তাদের জন্য নীচের উদাহরণটি দেখুন। আমি যা কিছু পেয়েছি তা হ'ল হয় ওলেডিবি, বাহ্যিক গ্রন্থাগার, বা কেবল কমা অনুসারে বিভাজন! আমার ক্ষেত্রে ওলেডিবি কাজ করছে না তাই আমি কিছু আলাদা চেয়েছিলাম।

আমি মার্কজে একটি নিবন্ধ পেয়েছি যা এখানে দেখা মাইক্রোসফ্ট.ভিউজুয়াল বেসিক.ফিলিও.সেক্সটফিল্ড পার্সার পদ্ধতিটি উল্লেখ করেছে । নিবন্ধটি ভিবিতে লেখা আছে এবং কোনও ডেটাটেবল ফিরিয়ে দেয় না, তাই নীচে আমার উদাহরণটি দেখুন।

public static DataTable LoadCSV(string path, bool hasHeader)
    {
        DataTable dt = new DataTable();

        using (var MyReader = new Microsoft.VisualBasic.FileIO.TextFieldParser(path))
        {
            MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
            MyReader.Delimiters = new String[] { "," };

            string[] currentRow;

            //'Loop through all of the fields in the file.  
            //'If any lines are corrupt, report an error and continue parsing.  
            bool firstRow = true;
            while (!MyReader.EndOfData)
            {
                try
                {
                    currentRow = MyReader.ReadFields();

                    //Add the header columns
                    if (hasHeader && firstRow)
                    {
                        foreach (string c in currentRow)
                        {
                            dt.Columns.Add(c, typeof(string));
                        }

                        firstRow = false;
                        continue;
                    }

                    //Create a new row
                    DataRow dr = dt.NewRow();
                    dt.Rows.Add(dr);

                    //Loop thru the current line and fill the data out
                    for(int c = 0; c < currentRow.Count(); c++)
                    {
                        dr[c] = currentRow[c];
                    }
                }
                catch (Microsoft.VisualBasic.FileIO.MalformedLineException ex)
                {
                    //Handle the exception here
                }
            }
        }

        return dt;
    }

3

খুব মৌলিক উত্তর: আপনার যদি জটিল জটিল সিএসভি না থাকে যা একটি সাধারণ বিভক্ত ফাংশন ব্যবহার করতে পারে তবে এটি আমদানির জন্য ভাল কাজ করবে (এই আমদানিকে স্ট্রিং হিসাবে নোট করুন, আমার যদি প্রয়োজন হয় তবে পরে ডেটাটাইপ রূপান্তরগুলি করব)

 private DataTable csvToDataTable(string fileName, char splitCharacter)
    {                
        StreamReader sr = new StreamReader(fileName);
        string myStringRow = sr.ReadLine();
        var rows = myStringRow.Split(splitCharacter);
        DataTable CsvData = new DataTable();
        foreach (string column in rows)
        {
            //creates the columns of new datatable based on first row of csv
            CsvData.Columns.Add(column);
        }
        myStringRow = sr.ReadLine();
        while (myStringRow != null)
        {
            //runs until string reader returns null and adds rows to dt 
            rows = myStringRow.Split(splitCharacter);
            CsvData.Rows.Add(rows);
            myStringRow = sr.ReadLine();
        }
        sr.Close();
        sr.Dispose();
        return CsvData;
    }

আমার পদ্ধতি যদি আমি একটি স্ট্রিং [] বিভাজক সহ একটি টেবিল আমদানি করে থাকি এবং আমি যে বর্তমান লাইনটি পড়ছি তা সিএসভি বা পাঠ্য ফাইলের পরবর্তী লাইনে চলে যেতে পারে এমন সমস্যাটি পরিচালনা করে <- যার ক্ষেত্রে আমি না পাওয়া পর্যন্ত লুপ করতে চাই প্রথম সারিতে লাইনগুলির মোট সংখ্যায় (কলাম)

public static DataTable ImportCSV(string fullPath, string[] sepString)
    {
        DataTable dt = new DataTable();
        using (StreamReader sr = new StreamReader(fullPath))
        {
           //stream uses using statement because it implements iDisposable
            string firstLine = sr.ReadLine();
            var headers = firstLine.Split(sepString, StringSplitOptions.None);
            foreach (var header in headers)
            {
               //create column headers
                dt.Columns.Add(header);
            }
            int columnInterval = headers.Count();
            string newLine = sr.ReadLine();
            while (newLine != null)
            {
                //loop adds each row to the datatable
                var fields = newLine.Split(sepString, StringSplitOptions.None); // csv delimiter    
                var currentLength = fields.Count();
                if (currentLength < columnInterval)
                {
                    while (currentLength < columnInterval)
                    {
                       //if the count of items in the row is less than the column row go to next line until count matches column number total
                        newLine += sr.ReadLine();
                        currentLength = newLine.Split(sepString, StringSplitOptions.None).Count();
                    }
                    fields = newLine.Split(sepString, StringSplitOptions.None);
                }
                if (currentLength > columnInterval)
                {  
                    //ideally never executes - but if csv row has too many separators, line is skipped
                    newLine = sr.ReadLine();
                    continue;
                }
                dt.Rows.Add(fields);
                newLine = sr.ReadLine();
            }
            sr.Close();
        }

        return dt;
    }

দুর্দান্ত আপনি সারিটি এখনও স্ট্রিং হিসাবে ঘোষণা করেন নি []।
প্রাণী স্টাইল

@ অ্যানিমাল স্টাইল আপনি ঠিক বলেছেন - আরও শক্তিশালী পদ্ধতিতে আপডেট করেছেন এবং সারি ঘোষিত করেছেন
ম্যাট ফার্গুসন

3

মিঃ চকবিভিট থেকে পরিবর্তিত

কাজের সমাধান:

string CSVFilePathName = APP_PATH + "Facilities.csv";
string[] Lines = File.ReadAllLines(CSVFilePathName);
string[] Fields;
Fields = Lines[0].Split(new char[] { ',' });
int Cols = Fields.GetLength(0);
DataTable dt = new DataTable();
//1st row must be column names; force lower case to ensure matching later on.
for (int i = 0; i < Cols-1; i++)
        dt.Columns.Add(Fields[i].ToLower(), typeof(string));
DataRow Row;
for (int i = 0; i < Lines.GetLength(0)-1; i++)
{
        Fields = Lines[i].Split(new char[] { ',' });
        Row = dt.NewRow();
        for (int f = 0; f < Cols-1; f++)
                Row[f] = Fields[f];
        dt.Rows.Add(Row);
}

সুতরাং এই একটি মেমরি সমস্যা ঠিক সমাধান? এটি লাইন প্রক্রিয়াকরণ দ্বারা লাইন এবং মেমরিতে অবিচল না তাই কোনও ব্যতিক্রম হওয়া উচিত না? এটি যেভাবে প্রক্রিয়াজাত করা হয় তা আমি পছন্দ করি তবে ফাইল হয় না llএডএললাইনগুলি () সমস্ত স্মৃতিতে সংরক্ষণ করে না? আমি মনে করি আপনার বিশাল মেমরি বাফার এড়ানোর জন্য ফাইল.ইডলাইনস () ব্যবহার করার কথা? এটি হাতে থাকা প্রশ্নের জন্য একটি উত্তরের উত্তর আমি কেবল স্মৃতি সম্পর্কিত উদ্বেগগুলি সম্পর্কে জানতে চাই।
DtechNet

2

এখানে একটি সমাধান যা ADO.Net এর ওডিবিসি পাঠ্য ড্রাইভার ব্যবহার করে:

Dim csvFileFolder As String = "C:\YourFileFolder"
Dim csvFileName As String = "YourFile.csv"

'Note that the folder is specified in the connection string,
'not the file. That's specified in the SELECT query, later.
Dim connString As String = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" _
    & csvFileFolder & ";Extended Properties=""Text;HDR=No;FMT=Delimited"""
Dim conn As New Odbc.OdbcConnection(connString)

'Open a data adapter, specifying the file name to load
Dim da As New Odbc.OdbcDataAdapter("SELECT * FROM [" & csvFileName & "]", conn)
'Then fill a data table, which can be bound to a grid
Dim dt As New DataTableda.Fill(dt)

grdCSVData.DataSource = dt

একবার ভরাট হয়ে গেলে, আপনি ADO.Net ডেটা অবজেক্টের সমস্ত ক্ষমতাকে কাজে লাগাতে কলামোনামের মতো ডেটাটেবলের বৈশিষ্ট্যগুলিকে মূল্য দিতে পারেন।

ভিএস ২০০৮ এ আপনি একই প্রভাব অর্জন করতে লিনক ব্যবহার করতে পারেন।

দ্রষ্টব্য: এটি এই SO প্রশ্নের সদৃশ হতে পারে ।


2

এটিতে আমার নিজের স্পিন যুক্ত করে প্রতিহত করতে পারবেন না। আমি অতীতে যা ব্যবহার করেছি তার চেয়ে এটি অনেক বেশি ভাল এবং আরও কমপ্যাক্ট।

এই সমাধান:

  • কোনও ডাটাবেস ড্রাইভার বা তৃতীয় পক্ষের লাইব্রেরির উপর নির্ভর করে না।
  • সদৃশ কলামের নামগুলিতে ব্যর্থ হবে না
  • ডেটাতে কমা পরিচালনা করে
  • শুধু কমা নয়, কোনও ডিলিমিটার পরিচালনা করে (যদিও এটি ডিফল্ট)

আমি এখানে যা এলাম তা এখানে:

  Public Function ToDataTable(FileName As String, Optional Delimiter As String = ",") As DataTable
    ToDataTable = New DataTable
    Using TextFieldParser As New Microsoft.VisualBasic.FileIO.TextFieldParser(FileName) With
      {.HasFieldsEnclosedInQuotes = True, .TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited, .TrimWhiteSpace = True}
      With TextFieldParser
        .SetDelimiters({Delimiter})
        .ReadFields.ToList.Unique.ForEach(Sub(x) ToDataTable.Columns.Add(x))
        ToDataTable.Columns.Cast(Of DataColumn).ToList.ForEach(Sub(x) x.AllowDBNull = True)
        Do Until .EndOfData
          ToDataTable.Rows.Add(.ReadFields.Select(Function(x) Text.BlankToNothing(x)).ToArray)
        Loop
      End With
    End Using
  End Function

স্ট্রিংগুলির তালিকায় অনন্য নম্বরগুলি কীভাবে যুক্ত করতে হয় তারUnique উত্তর হিসাবে আমার ডুপ্লিকেট কলামের নামগুলি পরিচালনা করতে এটি কোনও এক্সটেনশন পদ্ধতির ( ) উপর নির্ভর করে

এবং এখানে BlankToNothingসহায়ক ফাংশন:

  Public Function BlankToNothing(ByVal Value As String) As Object 
    If String.IsNullOrEmpty(Value) Then Return Nothing
    Return Value
  End Function

2

সঙ্গে Cinchoo সংক্ষিপ্তসার ETL - একটি ওপেন সোর্স লাইব্রেরি, আপনি সহজেই CSV ফাইল DataTable কোডের কয়েক লাইন দিয়ে রূপান্তর করতে পারেন।

using (var p = new ChoCSVReader(** YOUR CSV FILE **)
     .WithFirstLineHeader()
    )
{
    var dt = p.AsDataTable();
}

আরও তথ্যের জন্য, দয়া করে কোডপোজেক্ট নিবন্ধটি দেখুন।

আশা করি এটা সাহায্য করবে.


2
    private static DataTable LoadCsvData(string refPath)
    {
        var cfg = new Configuration() { Delimiter = ",", HasHeaderRecord = true };
        var result = new DataTable();
        using (var sr = new StreamReader(refPath, Encoding.UTF8, false, 16384 * 2))
        {
            using (var rdr = new CsvReader(sr, cfg))
            using (var dataRdr = new CsvDataReader(rdr))
            {
                result.Load(dataRdr);
            }
        }
        return result;
    }

ব্যবহার: https://joshclose.github.io/CsvHelper/


নোট করুন যে রিলিজে 13 Configuration নামটির CsvConfiguration স্থানটির বিরোধগুলি এড়ানোর জন্য নতুন নামকরণ করা হয়েছিল এই উত্তরটির ডেমো কাজ করছে: dotnetfiddle.net/sdwc6i
dbc

2

আমি এক্সেলডিটাআরডার নামে একটি লাইব্রেরি ব্যবহার করি, আপনি এটি নুগেটে খুঁজে পেতে পারেন। ExcelDataReader এবং ExcelDataReader.DataSet এক্সটেনশন উভয়ই ইনস্টল করতে ভুলবেন না (পরবর্তীটি নীচে নীচে উল্লেখ করা প্রয়োজনীয় AsDataSet পদ্ধতি সরবরাহ করে)।

আমি একটি ফাংশনে সবকিছু আবদ্ধ করেছি, আপনি সরাসরি আপনার কোড এ এটি অনুলিপি করতে পারেন। এটিকে সিএসভি ফাইলে পাথ দিন, এটি আপনাকে একটি টেবিল সহ একটি ডেটাসেট দেয়।

public static DataSet GetDataSet(string filepath)
{
   var stream = File.OpenRead(filepath);

   try
   {
       var reader = ExcelReaderFactory.CreateCsvReader(stream, new ExcelReaderConfiguration()
       {
           LeaveOpen = false
       });

       var result = reader.AsDataSet(new ExcelDataSetConfiguration()
       {
           // Gets or sets a value indicating whether to set the DataColumn.DataType 
           // property in a second pass.
           UseColumnDataType = true,

           // Gets or sets a callback to determine whether to include the current sheet
           // in the DataSet. Called once per sheet before ConfigureDataTable.
           FilterSheet = (tableReader, sheetIndex) => true,

           // Gets or sets a callback to obtain configuration options for a DataTable. 
           ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
           {
               // Gets or sets a value indicating the prefix of generated column names.
               EmptyColumnNamePrefix = "Column",

               // Gets or sets a value indicating whether to use a row from the 
               // data as column names.
               UseHeaderRow = true,

               // Gets or sets a callback to determine which row is the header row. 
               // Only called when UseHeaderRow = true.
               ReadHeaderRow = (rowReader) =>
               {
                   // F.ex skip the first row and use the 2nd row as column headers:
                   //rowReader.Read();
               },

               // Gets or sets a callback to determine whether to include the 
               // current row in the DataTable.
               FilterRow = (rowReader) =>
               {
                   return true;
               },

               // Gets or sets a callback to determine whether to include the specific
               // column in the DataTable. Called once per column after reading the 
               // headers.
               FilterColumn = (rowReader, columnIndex) =>
               {
                   return true;
               }
           }
       });

       return result;
   }
   catch (Exception ex)
   {
       return null;
   }
   finally
   {
       stream.Close();
       stream.Dispose();
   }
}

এটি ২০২০ এবং এখানে পুরানো কয়েকটি উত্তরের তুলনায় এটি দুর্দান্ত সমাধান। এটি দুর্দান্তভাবে প্যাকেজ হয়েছে এবং নিউগেট থেকে একটি জনপ্রিয় এবং লাইটওয়েট লাইব্রেরি ব্যবহার করে। এবং এটি নমনীয় - যদি আপনার সিএসভি মেমরিতে থাকে তবে কেবল MemoryStreamফাইল পাথের পরিবর্তে এটিকে পাস দিন । ওপি যে ডেটা টেবিলের জন্য জিজ্ঞাসা করেছিল তা সহজেই ডেটাসেট থেকে এইভাবে বের করা হয়:result.Tables[0]
তাওয়াব ওয়াকিল

1

কেবলমাত্র এই এক্সটেনশন পদ্ধতিগুলি ভাগ করে নেওয়া, আমি আশা করি এটি কারওর পক্ষে সহায়তা করতে পারে।

public static List<string> ToCSV(this DataSet ds, char separator = '|')
{
    List<string> lResult = new List<string>();

    foreach (DataTable dt in ds.Tables)
    {
        StringBuilder sb = new StringBuilder();
        IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().
                                          Select(column => column.ColumnName);
        sb.AppendLine(string.Join(separator.ToString(), columnNames));

        foreach (DataRow row in dt.Rows)
        {
            IEnumerable<string> fields = row.ItemArray.Select(field =>
              string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\""));
            sb.AppendLine(string.Join(separator.ToString(), fields));
        }

        lResult.Add(sb.ToString());
    }
    return lResult;
}

public static DataSet CSVtoDataSet(this List<string> collectionCSV, char separator = '|')
{
    var ds = new DataSet();

    foreach (var csv in collectionCSV)
    {
        var dt = new DataTable();

        var readHeader = false;
        foreach (var line in csv.Split(new[] { Environment.NewLine }, StringSplitOptions.None))
        {
            if (!readHeader)
            {
                foreach (var c in line.Split(separator))
                    dt.Columns.Add(c);
            }
            else
            {
                dt.Rows.Add(line.Split(separator));
            }
        }

        ds.Tables.Add(dt);
    }

    return ds;
}

0

এটি ব্যবহার করুন, একটি ফাংশন কমা এবং উদ্ধৃতিগুলির সমস্ত সমস্যার সমাধান করে:

public static DataTable CsvToDataTable(string strFilePath)
    {

        if (File.Exists(strFilePath))
        {

            string[] Lines;
            string CSVFilePathName = strFilePath;

            Lines = File.ReadAllLines(CSVFilePathName);
            while (Lines[0].EndsWith(","))
            {
                Lines[0] = Lines[0].Remove(Lines[0].Length - 1);
            }
            string[] Fields;
            Fields = Lines[0].Split(new char[] { ',' });
            int Cols = Fields.GetLength(0);
            DataTable dt = new DataTable();
            //1st row must be column names; force lower case to ensure matching later on.
            for (int i = 0; i < Cols; i++)
                dt.Columns.Add(Fields[i], typeof(string));
            DataRow Row;
            int rowcount = 0;
            try
            {
                string[] ToBeContinued = new string[]{};
                bool lineToBeContinued = false;
                for (int i = 1; i < Lines.GetLength(0); i++)
                {
                    if (!Lines[i].Equals(""))
                    {
                        Fields = Lines[i].Split(new char[] { ',' });
                        string temp0 = string.Join("", Fields).Replace("\"\"", "");
                        int quaotCount0 = temp0.Count(c => c == '"');
                        if (Fields.GetLength(0) < Cols || lineToBeContinued || quaotCount0 % 2 != 0)
                        {
                            if (ToBeContinued.GetLength(0) > 0)
                            {
                                ToBeContinued[ToBeContinued.Length - 1] += "\n" + Fields[0];
                                Fields = Fields.Skip(1).ToArray();
                            }
                            string[] newArray = new string[ToBeContinued.Length + Fields.Length];
                            Array.Copy(ToBeContinued, newArray, ToBeContinued.Length);
                            Array.Copy(Fields, 0, newArray, ToBeContinued.Length, Fields.Length);
                            ToBeContinued = newArray;
                            string temp = string.Join("", ToBeContinued).Replace("\"\"", "");
                            int quaotCount = temp.Count(c => c == '"');
                            if (ToBeContinued.GetLength(0) >= Cols && quaotCount % 2 == 0 )
                            {
                                Fields = ToBeContinued;
                                ToBeContinued = new string[] { };
                                lineToBeContinued = false;
                            }
                            else
                            {
                                lineToBeContinued = true;
                                continue;
                            }
                        }

                        //modified by Teemo @2016 09 13
                        //handle ',' and '"'
                        //Deserialize CSV following Excel's rule:
                        // 1: If there is commas in a field, quote the field.
                        // 2: Two consecutive quotes indicate a user's quote.

                        List<int> singleLeftquota = new List<int>();
                        List<int> singleRightquota = new List<int>();

                        //combine fileds if number of commas match
                        if (Fields.GetLength(0) > Cols) 
                        {
                            bool lastSingleQuoteIsLeft = true;
                            for (int j = 0; j < Fields.GetLength(0); j++)
                            {
                                bool leftOddquota = false;
                                bool rightOddquota = false;
                                if (Fields[j].StartsWith("\"")) 
                                {
                                    int numberOfConsecutiveQuotes = 0;
                                    foreach (char c in Fields[j]) //start with how many "
                                    {
                                        if (c == '"')
                                        {
                                            numberOfConsecutiveQuotes++;
                                        }
                                        else
                                        {
                                            break;
                                        }
                                    }
                                    if (numberOfConsecutiveQuotes % 2 == 1)//start with odd number of quotes indicate system quote
                                    {
                                        leftOddquota = true;
                                    }
                                }

                                if (Fields[j].EndsWith("\""))
                                {
                                    int numberOfConsecutiveQuotes = 0;
                                    for (int jj = Fields[j].Length - 1; jj >= 0; jj--)
                                    {
                                        if (Fields[j].Substring(jj,1) == "\"") // end with how many "
                                        {
                                            numberOfConsecutiveQuotes++;
                                        }
                                        else
                                        {
                                            break;
                                        }
                                    }

                                    if (numberOfConsecutiveQuotes % 2 == 1)//end with odd number of quotes indicate system quote
                                    {
                                        rightOddquota = true;
                                    }
                                }
                                if (leftOddquota && !rightOddquota)
                                {
                                    singleLeftquota.Add(j);
                                    lastSingleQuoteIsLeft = true;
                                }
                                else if (!leftOddquota && rightOddquota)
                                {
                                    singleRightquota.Add(j);
                                    lastSingleQuoteIsLeft = false;
                                }
                                else if (Fields[j] == "\"") //only one quota in a field
                                {
                                    if (lastSingleQuoteIsLeft)
                                    {
                                        singleRightquota.Add(j);
                                    }
                                    else
                                    {
                                        singleLeftquota.Add(j);
                                    }
                                }
                            }
                            if (singleLeftquota.Count == singleRightquota.Count)
                            {
                                int insideCommas = 0;
                                for (int indexN = 0; indexN < singleLeftquota.Count; indexN++)
                                {
                                    insideCommas += singleRightquota[indexN] - singleLeftquota[indexN];
                                }
                                if (Fields.GetLength(0) - Cols >= insideCommas) //probabaly matched
                                {
                                    int validFildsCount = insideCommas + Cols; //(Fields.GetLength(0) - insideCommas) may be exceed the Cols
                                    String[] temp = new String[validFildsCount];
                                    int totalOffSet = 0;
                                    for (int iii = 0; iii < validFildsCount - totalOffSet; iii++)
                                    {
                                        bool combine = false;
                                        int storedIndex = 0;
                                        for (int iInLeft = 0; iInLeft < singleLeftquota.Count; iInLeft++)
                                        {
                                            if (iii + totalOffSet == singleLeftquota[iInLeft])
                                            {
                                                combine = true;
                                                storedIndex = iInLeft;
                                                break;
                                            }
                                        }
                                        if (combine)
                                        {
                                            int offset = singleRightquota[storedIndex] - singleLeftquota[storedIndex];
                                            for (int combineI = 0; combineI <= offset; combineI++)
                                            {
                                                temp[iii] += Fields[iii + totalOffSet + combineI] + ",";
                                            }
                                            temp[iii] = temp[iii].Remove(temp[iii].Length - 1, 1);
                                            totalOffSet += offset;
                                        }
                                        else
                                        {
                                            temp[iii] = Fields[iii + totalOffSet];
                                        }
                                    }
                                    Fields = temp;
                                }
                            }
                        }
                        Row = dt.NewRow();
                        for (int f = 0; f < Cols; f++)
                        {
                            Fields[f] = Fields[f].Replace("\"\"", "\""); //Two consecutive quotes indicate a user's quote
                            if (Fields[f].StartsWith("\""))
                            {
                                if (Fields[f].EndsWith("\""))
                                {
                                    Fields[f] = Fields[f].Remove(0, 1);
                                    if (Fields[f].Length > 0)
                                    {
                                        Fields[f] = Fields[f].Remove(Fields[f].Length - 1, 1);
                                    }
                                }
                            }
                            Row[f] = Fields[f];
                        }
                        dt.Rows.Add(Row);
                        rowcount++;
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception( "row: " + (rowcount+2) + ", " + ex.Message);
            }
            //OleDbConnection connection = new OleDbConnection(string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}; Extended Properties=""text;HDR=Yes;FMT=Delimited"";", FilePath + FileName));
            //OleDbCommand command = new OleDbCommand("SELECT * FROM " + FileName, connection);
            //OleDbDataAdapter adapter = new OleDbDataAdapter(command);
            //DataTable dt = new DataTable();
            //adapter.Fill(dt);
            //adapter.Dispose();
            return dt;
        }
        else
            return null;

        //OleDbConnection connection = new OleDbConnection(string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}; Extended Properties=""text;HDR=Yes;FMT=Delimited"";", strFilePath));
        //OleDbCommand command = new OleDbCommand("SELECT * FROM " + strFileName, connection);
        //OleDbDataAdapter adapter = new OleDbDataAdapter(command);
        //DataTable dt = new DataTable();
        //adapter.Fill(dt);
        //return dt;
    }

0
 Public Function ReadCsvFileToDataTable(strFilePath As String) As DataTable
    Dim dtCsv As DataTable = New DataTable()
    Dim Fulltext As String
    Using sr As StreamReader = New StreamReader(strFilePath)
        While Not sr.EndOfStream
            Fulltext = sr.ReadToEnd().ToString()
            Dim rows As String() = Fulltext.Split(vbLf)
            For i As Integer = 0 To rows.Count() - 1 - 1
                Dim rowValues As String() = rows(i).Split(","c)
                If True Then
                    If i = 0 Then
                        For j As Integer = 0 To rowValues.Count() - 1
                            dtCsv.Columns.Add(rowValues(j))
                        Next
                    Else
                        Dim dr As DataRow = dtCsv.NewRow()
                        For k As Integer = 0 To rowValues.Count() - 1
                            dr(k) = rowValues(k).ToString()
                        Next
                        dtCsv.Rows.Add(dr)
                    End If
                End If
            Next
        End While
    End Using
    Return dtCsv
End Function

0

আমি সম্প্রতি নেট নেট এর জন্য একটি সিএসভি পার্সার লিখেছি যে আমি দাবি করছি বর্তমানে নুগেট প্যাকেজ হিসাবে সবচেয়ে দ্রুত উপলব্ধ: সিলবান.ডাটা.সিএসভি

একটি লোড করতে এই গ্রন্থাগারটি ব্যবহার DataTableকরা অত্যন্ত সহজ।

using var tr = File.OpenText("data.csv");
using var dr = CsvDataReader.Create(tr);
var dt = new DataTable();
dt.Load(dr);

আপনার ফাইলটি শিরোনাম সহ স্ট্যান্ডার্ড কমা দ্বারা পৃথক করা ফাইল, এটি আপনার কেবল প্রয়োজন Ass শিরোনাম ছাড়াই ফাইলগুলি পড়ার অনুমতি দেওয়া, এবং বিকল্প সীমানার ব্যবহার ইত্যাদিও রয়েছে options

সিএসভি ফাইলের জন্য একটি কাস্টম স্কিমা সরবরাহ করাও সম্ভব যাতে কলামগুলি stringমান ব্যতীত অন্য কিছু হিসাবে বিবেচনা করতে পারে । এটি DataTableকলামগুলিকে এমন মানগুলিতে লোড করার মঞ্জুরি দেয় যাগুলির সাথে কাজ করা আরও সহজ হতে পারে, কারণ আপনি যখন তাদের অ্যাক্সেস করবেন তখন তাদের বাধ্য করতে হবে না।

var schema = new TypedCsvSchema();
schema.Add(0, typeof(int));
schema.Add(1, typeof(string));
schema.Add(2, typeof(double?));
schema.Add(3, typeof(DateTime));
schema.Add(4, typeof(DateTime?));

var options = new CsvDataReaderOptions { 
    Schema = schema 
};

using var tr = GetData();
using var dr = CsvDataReader.Create(tr, options);

TypedCsvSchemaএটি এমন একটি বাস্তবায়ন ICsvSchemaProviderযা কলামগুলির প্রকারের সংজ্ঞা দেওয়ার জন্য একটি সহজ উপায় সরবরাহ করে। তবে ICsvSchemaProviderআপনি যখন আরও মেটাডেটা সরবরাহ করতে চান যেমন একটি স্বতন্ত্রতা বা সীমাবদ্ধ কলামের আকার ইত্যাদির জন্য একটি কাস্টম সরবরাহ করাও সম্ভব etc.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.