সিএসভি ফাইল পড়া এবং একটি অ্যারেতে মান সংরক্ষণ করা


317

আমি একটি *.csvফাইল পড়ার চেষ্টা করছি ।

*.csv-File সেমিকোলন ( "দ্বারা পৃথক দুটি কলাম দ্বারা গঠিত ; ")।

আমি *.csvস্ট্রিমরিডার ব্যবহার করে-ফাইলটি পড়তে সক্ষম এবং এটি ব্যবহার করে প্রতিটি লাইন পৃথক করতে সক্ষমSplit() ফাংশনটি । আমি প্রতিটি কলাম আলাদা আলাদা অ্যারেতে সঞ্চয় করতে এবং তারপরে এটি প্রদর্শন করতে চাই।

ওটা করা কি সম্ভব?


2
@Marc: দুর্ভাগ্যবশত অ ইংরেজি সংস্কৃতির (যেমন ইতালীয়) এ যখন আপনি সংরক্ষণ একটি সীমা অতিক্রম করা CSV তে এটি ব্যবহার করে ";"বিভাজক হিসেবে ... এই করেছেন যে CSV কোনো অ-মানক নিচ :(
digEmAll

25
আমি সর্বদা CSV কে অক্ষর-বিচ্ছিন্ন-মান হিসাবে পড়ি কারণ লোকেরা ফাইলগুলি সিএসভি কল করে এমনকি তারা বিভাজক হিসাবে কমা ব্যবহার না করে। এবং বাস্তবে বিভিন্ন উদ্ধৃতি বা পালানোর নিয়ম সহ অনেকগুলি উপভাষা রয়েছে যে তাত্ত্বিকভাবে কোনও আরএফসি থাকলেও আপনি সত্যিকার অর্থে কোনও স্ট্যান্ডার্ডের কথা বলতে পারবেন না।
কোডসইনচাওস

1
সিএসভি ফাইল এক্সটেনশনের নামটি এখন ডিএসভি-তে পরিবর্তন করা উচিত
ডিলিমিটার পৃথকীকরণকৃত

এই উত্তরগুলির জন্য যা ডিলিমিটার চরিত্রটিতে কেবল স্ট্রিংকে বিভক্ত করে, এটি যাওয়ার সেরা উপায় নয়। সিএসভি ফর্ম্যাটের আরও নিয়ম রয়েছে যা এটি কভার করবে না। তৃতীয় পক্ষের পার্সার ব্যবহার করা ভাল। আরও তথ্য- dotnetcoretutorials.com/2018/08/04/csv-parsing-in-net-core
ইলিকেটোড

উত্তর:


415

আপনি এটি এর মতো করতে পারেন:

using System.IO;

static void Main(string[] args)
{
    using(var reader = new StreamReader(@"C:\test.csv"))
    {
        List<string> listA = new List<string>();
        List<string> listB = new List<string>();
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            var values = line.Split(';');

            listA.Add(values[0]);
            listB.Add(values[1]);
        }
    }
}

5
এর জন্য ধন্যবাদ, আমি কীভাবে সিএসভি ফাইলে লাইনগুলি বিভক্ত করতে ভুলে গিয়েছিলাম (আমাকে বোবা!) তবে আপনার সমাধান আমাকে সাহায্য করেছিল :)
হাল্লাগান

4
এটি 3 বছর পরে এবং এই প্রশ্নটি এখনও কাউকে সহায়তা করছে। আমার খারাপ লাগছে যে আপনি এ বিষয়ে কোনও গ্রহণযোগ্যতা পান নি।
AdamMc331

12
কমা ইত্যাদির সাহায্যে ক্ষেত্রের মানগুলি পরিচালনা করে না
মাইক

12
একটি ব্যবহার করা উচিত usingএখানে দফা, বা অন্ততপক্ষে ম্যানুয়ালি এটা হিসাবে একটি এর সম্পদ। Close()readerIDisposible
আসফ ইস্রায়েল

30
এটাও সঠিকভাবে একটি CSV মত লিখিত হবে পার্স column1;"Special ; char in string";column3- tools.ietf.org/html/rfc4180
ওলে কে

173

আমার প্রিয় সিএসভি পার্সারটি নেট। লাইব্রেরিতে অন্তর্নির্মিত। এটি মাইক্রোসফ্ট-ভিজুয়ালবাসিক নেমস্পেসের ভিতরে একটি লুকানো ধন treasure নীচে একটি নমুনা কোড দেওয়া হয়েছে:

using Microsoft.VisualBasic.FileIO;

var path = @"C:\Person.csv"; // Habeeb, "Dubai Media City, Dubai"
using (TextFieldParser csvParser = new TextFieldParser(path))
{
 csvParser.CommentTokens = new string[] { "#" };
 csvParser.SetDelimiters(new string[] { "," });
 csvParser.HasFieldsEnclosedInQuotes = true;

 // Skip the row with the column names
 csvParser.ReadLine();

 while (!csvParser.EndOfData)
 {
  // Read current line fields, pointer moves to the next line.
  string[] fields = csvParser.ReadFields();
  string Name = fields[0];
  string Address = fields[1];
 }
}

রেফারেন্স যোগ করতে ভুলবেন না Microsoft.VisualBasic

পার্সার সম্পর্কিত আরও বিশদ এখানে দেওয়া আছে: http://codeskaters.blogspot.ae/2015/11/c-easiest-csv-parser-built-in-net.html


6
আমি এই বিকল্পটি সবচেয়ে পছন্দ করি। ক্লাসটি কোনও সিএসভি পার্সার হওয়ায় এবং নিজেকে ম্যানুয়ালভাবে তৈরি করা কিছু নয় বলে আমাকে পালানোর অক্ষরগুলির বিষয়ে চিন্তা করতে হবে না।
টিমোথি গঞ্জালেজ

22
যদি কেউ এটির মধ্যে চলে এবং অবাক হয়ে থাকে, আপনাকে অবশ্যই Microsoft.VisualBasicফ্রেমওয়ার্ক সমাবেশের রেফারেন্স অন্তর্ভুক্ত করতে হবে কারণ এটি সাধারণত ডিফল্টরূপে উল্লেখ করা হয় না।
apokryfos

3
আমি যদি আমার ভিবি 6 দিনের থেকে এটি মনে রাখতাম তবে কয়েক বছর ধরে আমাকে অনেক সময় সাশ্রয় করতে পারত। কেউ কেউ ভিবি সম্পর্কে কৌতুক করবেন, আমার কোডে dll এবং নেমস্পেস যুক্ত করার কোনও সমস্যা নেই যদি এর মান থাকে তবে। এটির মান অনেক বেশি।
ওয়াল্টার

2
এই সমাধানটি একটি হোমরুন। আমার অভিজ্ঞতা থেকে খুব নির্ভরযোগ্য পার্সার।
গ্লেন ফেরি

3
শুধু ভিবি ডিএল-তে কেন?
মার্ক চোই

75

লিনকু উপায়:

var lines = File.ReadAllLines("test.txt").Select(a => a.Split(';'));
var csv = from line in lines
          select (from piece in line
                  select piece);

R ভুল - নিক দ্বারা সম্পাদনা করুন

দেখা যাচ্ছে যে আসল উত্তরদাতারা csv2 মাত্রিক অ্যারে - একটি অ্যারে সহ অ্যারে যুক্ত করার চেষ্টা করছিল । প্রথম অ্যারেতে প্রতিটি আইটেমে একটি অ্যারে থাকে যা নির্দিষ্ট কলামের জন্য ডেটাযুক্ত নেস্টেড অ্যারেতে প্রতিটি আইটেমের সাথে সেই লাইন নম্বরটি উপস্থাপন করে।

var csv = from line in lines
          select (line.Split(',')).ToArray();

2
সম্ভবত আমি কিছু মিস করছি, তবে আমি নিশ্চিত নই যে আপনার সিএসভি ভেরিয়েবলের মূল বিন্দুটি কী - আপনি কেবল একই লাইনের কাঠামোগুলি তৈরি করছেন না যা লাইনগুলিতে প্রসারিত?
বেন হিউজেস

13
@ ক্লেশানন। নেট 1.1? আমি ... তোমার জন্য খুব দুঃখিত
যোগাযোগমেট

5
@ কনট্যাকটম্যাট: আমি আপনাকে এই অনুভূতি থেকে বঞ্চিত করব না।
বি। ক্লে শ্যানন

9
আমি আরও উল্লেখ করতে চাই যে সিএসভির উদ্ধৃতি দেওয়া যেতে পারে ... সুতরাং স্ট্রিং.স্প্লিট ব্যবহার করা একটি কার্যকর বিকল্প নয়।
অ্যালেক্সান্ডার

5
আমি পাচ্ছি: 'সিস্টেম.আর'এর জন্য' স্প্লিট 'এর সংজ্ঞা নেই এবং' সিস্টেম.আর্রে 'টাইপের প্রথম যুক্তি স্বীকার করার কোনও এক্সটেনশন পদ্ধতি' স্প্লিট 'পাওয়া যাবে না (আপনি কি কোনও নির্দেশিকা বা বিধানসভা রেফারেন্স ব্যবহার করে মিস করছেন? ?)
কালা জে

36

আপনি তত্ক্ষণাত অ্যারে তৈরি করতে পারবেন না কারণ আপনাকে প্রথম থেকেই সারিগুলির সংখ্যা জানতে হবে (এবং এর জন্য সিএসভি ফাইলটি দুবার পড়তে হবে)

আপনি দুটিতে মান সংরক্ষণ করতে পারেন List<T>এবং সেগুলি ব্যবহার করে বা ব্যবহার করে একটি অ্যারেতে রূপান্তর করতে পারেনList<T>.ToArray()

খুব সাধারণ উদাহরণ:

var column1 = new List<string>();
var column2 = new List<string>();
using (var rd = new StreamReader("filename.csv"))
{
    while (!rd.EndOfStream)
    {
        var splits = rd.ReadLine().Split(';');
        column1.Add(splits[0]);
        column2.Add(splits[1]);
    }
}
// print column1
Console.WriteLine("Column 1:");
foreach (var element in column1)
    Console.WriteLine(element);

// print column2
Console.WriteLine("Column 2:");
foreach (var element in column2)
    Console.WriteLine(element);

বিশেষ দ্রষ্টব্য

দয়া করে মনে রাখবেন এটি কেবল একটি খুব সাধারণ উদাহরণstring.Splitকিছু রেকর্ডের ;অভ্যন্তরে বিভাজক থাকে এমন ক্ষেত্রে অ্যাকাউন্ট ব্যবহার করা যায় না ।
একটি নিরাপদ পদ্ধতির জন্য, কিছু কিছু সিএসভি নির্দিষ্ট গ্রন্থাগার যেমন নুগেটে CSvHelper ব্যবহার করার কথা বিবেচনা করুন।


;উদাহরণস্বরূপ মানটির অংশ হওয়ার জন্য অ্যাকাউন্ট করে না "value with ; inside it"। এটিকে আক্ষরিক স্ট্রিং বলে ডাবল উদ্ধৃতি সহ সিএসভি চারপাশের বিশেষ অক্ষর সমেত মানগুলি।
চিকেনফিট

1
@ চিকেনফিট: অবশ্যই, ক্যাপশনের কারণ এটি: "খুব সাধারণ উদাহরণ" । যাইহোক আমি সে সম্পর্কে একটি নোট যুক্ত করতে পারি;)
digEmAll

কোনও উদ্বেগ নেই, আমি লক্ষ্য করেছি যে এখানে প্রচুর অন্যান্য উত্তরও এর জন্য অ্যাকাউন্ট করে না :)
চিকেনফিট

1
Regex.Split (sr.ReadLine (), ", (? = (?: [^ \"] * \ "[^ \"] * * \ ")) * [^ \"] * $) "); // পাওয়া গেছে তাই এই ... একটি গ্রন্থাগার চেয়ে দ্রুত।
চিম্টি

34

এই লাইব্রেরিটি সবেমাত্র এসেছে: https://github.com/ জোশক্লোস / সিএসভিহেল্পার

খুব স্বজ্ঞাত এবং সহজেই ব্যবহারযোগ্য। একটি ন্যুগেট প্যাকেজও রয়েছে যা কার্যকর করেছে তাড়াতাড়ি: http://nuget.org/packages/CsvHelper/1.17.0 । আমি পছন্দ করি যা সক্রিয়ভাবে রক্ষণাবেক্ষণের জন্য উপস্থিত হয়।

একটি আধা-কোলন ব্যবহারের জন্য এটি কনফিগার করা সহজ: https://github.com/ জোশক্লোস / সিএসভিহেল্পার / উইকি / কাস্টম- কনফিগারেশন


3
এটাই সেরা উত্তর! দৃ drop় লাইব্রেরি যা সহজেই ফেলে রাখা যায় এবং এতে রোল করা যায়।
টাইলার ফোরসিথে

3
CSvHelper লাইব্রেরি দুর্দান্ত। সুপার দ্রুত এবং সহজেই ব্যবহারযোগ্য।
স্টিভ প্যারিশ

3
আপনি যদি এমন একটি লাইব্রেরি সন্ধান করছেন যা উদ্ধৃত স্ট্রিং সহ সিএসভি ফর্ম্যাটটির প্রতিটি বিষয় নিয়ে কাজ করতে পারে তবে এইটি ব্যবহার করুন। অসাধারণ!
ম্যাট

Thx, সত্যিই দুর্দান্ত লাইব্রেরি, সহজেই ব্যবহারযোগ্য এবং খুব শক্ত।
সেবাস্তিয়ান গেরেরো

2
পারফরম্যান্সটি কীভাবে তুলনা করে Microsoft.VisualBasic.FileIO.TextFieldParser(সিএফ। @ হবিবের উত্তর)?
বোল্ডার

33

আমি সাধারণত কোডেপ্রজেক্ট থেকে এই পার্সারটি ব্যবহার করি , যেহেতু প্রচুর পরিমাণে চরিত্র পালিয়ে যায় এবং এটি আমার পক্ষে পরিচালনা করে।


2
এই জিনিস খুব ভাল এবং দ্রুত। আপনি যদি কোনও ব্যবসায়িক পরিস্থিতিতে থাকেন এবং এটি ক্র্যাকিংয়ের প্রয়োজন।
gjvdkamp

8
এই পার্সারটি নুগেট গ্যালারীটিতে LumenWorks.Framework.IO হিসাবে উপলভ্য, যদি আপনি কোডপ্রজেক্টটি ডাউনলোড করার জন্য নিবন্ধন করতে না চান তবে।
গ্রেগ ম্যাককয়

30

এখানে আমার শীর্ষে ভোট দেওয়া উত্তরের বিভিন্নতা:

var contents = File.ReadAllText(filename).Split('\n');
var csv = from line in contents
          select line.Split(',').ToArray();

csvপরিবর্তনশীল তারপর নিম্নলিখিত উদাহরণে হিসাবে ব্যবহার করা যেতে পারে:

int headerRows = 5;
foreach (var row in csv.Skip(headerRows)
    .TakeWhile(r => r.Length > 1 && r.Last().Trim().Length > 0))
{
    String zerothColumnValue = row[0]; // leftmost column
    var firstColumnValue = row[1];
}

আপনি কীভাবে CSV ভেরিয়েবলের সারি এবং কলামগুলি অ্যাক্সেস করতে পারেন?
ম্যাথু লক

1
কিভাবে আপনি পালানোর কমা পরিচালনা করবেন?
কুয়াংওয়ে জাং

কলামগুলির মধ্যে কমাগুলি পরিচালনা করে না। জোশের জবাব অনুসারে মজবুত গ্রন্থাগার সিএসভিহেল্পার ব্যবহার করা আরও ভাল
টিম

11

আপনার যদি (মাথা-) লাইনগুলি এবং / অথবা কলামগুলি এড়ানো দরকার হয় তবে আপনি এটি 2-মাত্রিক অ্যারে তৈরি করতে ব্যবহার করতে পারেন:

    var lines = File.ReadAllLines(path).Select(a => a.Split(';'));
    var csv = (from line in lines               
               select (from col in line
               select col).Skip(1).ToArray() // skip the first column
              ).Skip(2).ToArray(); // skip 2 headlines

এটি আরও কার্যকর যদি আপনার আরও প্রক্রিয়া করার আগে ডেটাটি আকার দেওয়ার দরকার হয় (ধরে নিলে প্রথম 2 টি লাইন শিরোনামটি ধারণ করে এবং প্রথম কলামটি একটি সারি শিরোনাম - যা আপনাকে অ্যারেতে লাগবে না কারণ আপনি কেবল ডেটা বিবেচনা করতে চান)।

এনবি আপনি নীচের কোডটি ব্যবহার করে খুব সহজেই শিরোনাম এবং 1 ম কলাম পেতে পারেন:

    var coltitle = (from line in lines 
                    select line.Skip(1).ToArray() // skip 1st column
                   ).Skip(1).Take(1).FirstOrDefault().ToArray(); // take the 2nd row
    var rowtitle = (from line in lines select line[0] // take 1st column
                   ).Skip(2).ToArray(); // skip 2 headlines

এই কোড উদাহরণটি আপনার *.csvফাইলের নিম্নলিখিত কাঠামোটিকে ধরে নিয়েছে :

সিএসভি ম্যাট্রিক্স

দ্রষ্টব্য: আপনার যদি খালি সারিগুলি এড়ানো প্রয়োজন হয় - যা কখনও কখনও সহজেই কার্যকর হয় তবে আপনি সন্নিবেশ করে এটি করতে পারেন

    where line.Any(a=>!string.IsNullOrWhiteSpace(a))

মধ্যে fromএবং selectবিবৃতি LINQ উপরের কোড উদাহরণ।


10

উন্নত পারফরম্যান্সের জন্য আপনি সি # তে মাইক্রোসফ্ট.ভিউজুয়ালবাসিক.ফিলিও.টেক্সটফিল্ড পার্সার 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;
}

9
এটি তত দক্ষ নয় কারণ স্প্লিট টেক্সটফিল্ড পার্সার যা কিছু করে তা করে না। উদাহরণস্বরূপ, মন্তব্য লাইনগুলি এড়িয়ে যান, উদ্ধৃত ক্ষেত্রগুলি হ্যান্ডেল করুন এবং প্রারম্ভিক / পেছনের সাদা স্থান সরিয়ে ফেলুন। ঠিক 1: 1 তুলনা নয়।
রবার্ট ম্যাককি

5

হাই সব, আমি এটি করার জন্য একটি স্ট্যাটিক ক্লাস তৈরি করেছি class + কলাম চেক + কোটা সাইন অপসারণ

public static class CSV
{
    public static List<string[]> Import(string file, char csvDelimiter, bool ignoreHeadline, bool removeQuoteSign)
    {
        return ReadCSVFile(file, csvDelimiter, ignoreHeadline, removeQuoteSign);
    }

    private static List<string[]> ReadCSVFile(string filename, char csvDelimiter, bool ignoreHeadline, bool removeQuoteSign)
    {
        string[] result = new string[0];
        List<string[]> lst = new List<string[]>();

        string line;
        int currentLineNumner = 0;
        int columnCount = 0;

        // Read the file and display it line by line.  
        using (System.IO.StreamReader file = new System.IO.StreamReader(filename))
        {
            while ((line = file.ReadLine()) != null)
            {
                currentLineNumner++;
                string[] strAr = line.Split(csvDelimiter);
                // save column count of dirst line
                if (currentLineNumner == 1)
                {
                    columnCount = strAr.Count();
                }
                else
                {
                    //Check column count of every other lines
                    if (strAr.Count() != columnCount)
                    {
                        throw new Exception(string.Format("CSV Import Exception: Wrong column count in line {0}", currentLineNumner));
                    }
                }

                if (removeQuoteSign) strAr = RemoveQouteSign(strAr);

                if (ignoreHeadline)
                {
                    if(currentLineNumner !=1) lst.Add(strAr);
                }
                else
                {
                    lst.Add(strAr);
                }
            }

        }

        return lst;
    }
    private static string[] RemoveQouteSign(string[] ar)
    {
        for (int i = 0;i< ar.Count() ; i++)
        {
            if (ar[i].StartsWith("\"") || ar[i].StartsWith("'")) ar[i] = ar[i].Substring(1);
            if (ar[i].EndsWith("\"") || ar[i].EndsWith("'")) ar[i] = ar[i].Substring(0,ar[i].Length-1);

        }
        return ar;
    }

}

4
var firstColumn = new List<string>();
var lastColumn = new List<string>();

// your code for reading CSV file

foreach(var line in file)
{
    var array = line.Split(';');
    firstColumn.Add(array[0]);
    lastColumn.Add(array[1]);
}

var firstArray = firstColumn.ToArray();
var lastArray = lastColumn.ToArray();

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

আমি প্রথম মান ধরে নিলাম যদি পিকে - আপনার ডেটাবেস থেকে আইডি দ্বারা একটি রেকর্ড পেতে হবে এবং এটি আপডেট আপডেট বিবরণ ইস্যু করার চেয়ে উপস্থিত থাকলে অন্যথায় একটি নতুন রেকর্ড সন্নিবেশ করান।
জাকুব কনেক্কি

3

এখানে একটি বিশেষ কেস রয়েছে যেখানে ডেটা ক্ষেত্রের একটিতে সেমিকোলন (";") রয়েছে যার অংশ হিসাবে এটির উপরের উত্তরগুলির বেশিরভাগ উত্তর ব্যর্থ হবে will

সমাধান করুন যে কেস হবে

string[] csvRows = System.IO.File.ReadAllLines(FullyQaulifiedFileName);
string[] fields = null;
List<string> lstFields;
string field;
bool quoteStarted = false;
foreach (string csvRow in csvRows)
{
    lstFields = new List<string>();
    field = "";
    for (int i = 0; i < csvRow.Length; i++)
    {
        string tmp = csvRow.ElementAt(i).ToString();
        if(String.Compare(tmp,"\"")==0)
        {
            quoteStarted = !quoteStarted;
        }
        if (String.Compare(tmp, ";") == 0 && !quoteStarted)
        {
            lstFields.Add(field);
            field = "";
        }
        else if (String.Compare(tmp, "\"") != 0)
        {
            field += tmp;
        }
    }
    if(!string.IsNullOrEmpty(field))
    {
        lstFields.Add(field);
        field = "";
    }
// This will hold values for each column for current row under processing
    fields = lstFields.ToArray(); 
}

2

ওপেন সোর্স Angara.Table লাইব্রেরি CSV টাইপযুক্ত কলামগুলিতে লোড করতে দেয়, যাতে আপনি কলামগুলি থেকে অ্যারেগুলি পেতে পারেন। প্রতিটি কলামে নাম বা সূচী উভয়ই সূচিযুক্ত করা যেতে পারে। Http://predictionmachines.github.io/Angara.Table/saveload.html দেখুন ।

লাইব্রেরিটি সিএসভির জন্য আরএফসি 4180 অনুসরণ করে; এটি টাইপ অনুমিতি এবং মাল্টলাইন স্ট্রিং সক্ষম করে।

উদাহরণ:

using System.Collections.Immutable;
using Angara.Data;
using Angara.Data.DelimitedFile;

...

ReadSettings settings = new ReadSettings(Delimiter.Semicolon, false, true, null, null);
Table table = Table.Load("data.csv", settings);
ImmutableArray<double> a = table["double-column-name"].Rows.AsReal;

for(int i = 0; i < a.Length; i++)
{
    Console.WriteLine("{0}: {1}", i, a[i]);
}

আপনি কলামটি টাইপ ব্যবহার করে একটি কলামের প্রকার দেখতে পাবেন, যেমন

Column c = table["double-column-name"];
Console.WriteLine("Column {0} is double: {1}", c.Name, c.Rows.IsRealColumn);

যেহেতু পাঠাগারটি এফ # তে ফোকাস করছে, তাই আপনার এফএসহার্প.কোর ৪.৪ সমাবেশে একটি রেফারেন্স যুক্ত করতে হবে; প্রকল্পে 'রেফারেন্স যুক্ত করুন' ক্লিক করুন এবং "এসেম্বলিস" -> "এক্সটেনশানস" এর অধীনে FSharp.Core 4.4 চয়ন করুন।


2

আমি সঠিক লাইব্রেরির সন্ধানে কয়েক ঘন্টা ব্যয় করেছি, তবে শেষ পর্যন্ত আমি আমার নিজস্ব কোড লিখেছিলাম :) আপনি যে কোনও সরঞ্জাম দিয়ে ফাইল (বা ডাটাবেস) পড়তে পারেন এবং তারপরে প্রতিটি লাইনে নিম্নলিখিত রুটিন প্রয়োগ করতে পারেন:

private static string[] SmartSplit(string line, char separator = ',')
{
    var inQuotes = false;
    var token = "";
    var lines = new List<string>();
    for (var i = 0; i < line.Length; i++) {
        var ch = line[i];
        if (inQuotes) // process string in quotes, 
        {
            if (ch == '"') {
                if (i<line.Length-1 && line[i + 1] == '"') {
                    i++;
                    token += '"';
                }
                else inQuotes = false;
            } else token += ch;
        } else {
            if (ch == '"') inQuotes = true;
            else if (ch == separator) {
                lines.Add(token);
                token = "";
                } else token += ch;
            }
    }
    lines.Add(token);
    return lines.ToArray();
}

1

আমি বহু বছর ধরে csvreader.com (প্রদত্ত উপাদান) ব্যবহার করে আসছি এবং আমার কখনও সমস্যা হয়নি। এটি শক্ত, ছোট এবং দ্রুত, তবে আপনাকে এটির জন্য মূল্য দিতে হবে। আপনি যা পছন্দ করেন তা ডিলিমিটার সেট করতে পারেন।

using (CsvReader reader = new CsvReader(s) {
    reader.Settings.Delimiter = ';';
    reader.ReadHeaders();  // if headers on a line by themselves.  Makes reader.Headers[] available
    while (reader.ReadRecord())
        ... use reader.Values[col_i] ...
}

1

আমি কেবল আমার মাস্টারের থিসিসে কাজ করা ছাত্র, তবে এটিই আমি এটি সমাধান করেছি এবং এটি আমার পক্ষে ভালভাবে কাজ করেছে। প্রথমে আপনি ডিরেক্টরি থেকে আপনার ফাইল নির্বাচন করুন (কেবলমাত্র CSV ফর্ম্যাটে) এবং তারপরে আপনি তালিকাগুলিতে ডেটাটি রেখে দিন।

List<float> t = new List<float>();
List<float> SensorI = new List<float>();
List<float> SensorII = new List<float>();
List<float> SensorIII = new List<float>();
using (OpenFileDialog dialog = new OpenFileDialog())
{
    try
    {
        dialog.Filter = "csv files (*.csv)|*.csv";
        dialog.Multiselect = false;
        dialog.InitialDirectory = ".";
        dialog.Title = "Select file (only in csv format)";
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            var fs = File.ReadAllLines(dialog.FileName).Select(a => a.Split(';'));
            int counter = 0;
            foreach (var line in fs)
            {
                counter++;
                if (counter > 2)    // Skip first two headder lines
                {
                    this.t.Add(float.Parse(line[0]));
                    this.SensorI.Add(float.Parse(line[1]));
                    this.SensorII.Add(float.Parse(line[2]));
                    this.SensorIII.Add(float.Parse(line[3]));
                }
            }
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show(
            "Error while opening the file.\n" + exc.Message, 
            this.Text, 
            MessageBoxButtons.OK, 
            MessageBoxIcon.Error
        );
    }
}

0

এখনও ভুল। আপনাকে উদ্ধৃতিতে "" ক্ষতিপূরণ দিতে হবে। এখানে আমার সমাধান মাইক্রোসফ্ট স্টাইল সিএসভি।

               /// <summary>
    /// Microsoft style csv file.  " is the quote character, "" is an escaped quote.
    /// </summary>
    /// <param name="fileName"></param>
    /// <param name="sepChar"></param>
    /// <param name="quoteChar"></param>
    /// <param name="escChar"></param>
    /// <returns></returns>
    public static List<string[]> ReadCSVFileMSStyle(string fileName, char sepChar = ',', char quoteChar = '"')
    {
        List<string[]> ret = new List<string[]>();

        string[] csvRows = System.IO.File.ReadAllLines(fileName);

        foreach (string csvRow in csvRows)
        {
            bool inQuotes = false;
            List<string> fields = new List<string>();
            string field = "";
            for (int i = 0; i < csvRow.Length; i++)
            {
                if (inQuotes)
                {
                    // Is it a "" inside quoted area? (escaped litteral quote)
                    if(i < csvRow.Length - 1 && csvRow[i] == quoteChar && csvRow[i+1] == quoteChar)
                    {
                        i++;
                        field += quoteChar;
                    }
                    else if(csvRow[i] == quoteChar)
                    {
                        inQuotes = false;
                    }
                    else
                    {
                        field += csvRow[i];
                    }
                }
                else // Not in quoted region
                {
                     if (csvRow[i] == quoteChar)
                    {
                        inQuotes = true;
                    }
                    if (csvRow[i] == sepChar)
                    {
                        fields.Add(field);
                        field = "";
                    }
                    else 
                    {
                        field += csvRow[i];
                    }
                }
            }
            if (!string.IsNullOrEmpty(field))
            {
                fields.Add(field);
                field = "";
            }
            ret.Add(fields.ToArray());
        }

        return ret;
    }
}

3
কলাম মানগুলির মধ্যে নতুন লাইন থাকলে এটি কেস পরিচালনা করে না;)
এমিল

0

আমার কাছে একটি লাইব্রেরি রয়েছে যা আপনার প্রয়োজন মতোই করছে।

কিছু সময় আগে আমি সিএসভি ফাইলগুলির সাথে কাজের জন্য সহজ এবং দ্রুত পর্যাপ্ত লাইব্রেরি লিখেছিলাম। আপনি এটি নীচের লিঙ্কটি দ্বারা সন্ধান করতে পারেন: https://github.com/ukushu/DataExporter

এটি 2 টি মাত্রার অ্যারের মতো সিএসভিতে কাজ করে। ঠিক যেমন আপনার প্রয়োজন ঠিক তেমন।

উদাহরণস্বরূপ, আপনার ক্ষেত্রে তৃতীয় সারির সমস্ত মানের প্রয়োজন কেবল আপনাকে লিখতে হবে:

Csv csv = new Csv();

csv.FileOpen("c:\\file1.csv");

var allValuesOf3rdRow = csv.Rows[2];

বা 2 য় কক্ষ পড়তে

var value = csv.Rows[2][1];

-1

এটা দেখ

সিএসভি ফ্রেমওয়ার্ক ব্যবহার করে;

সিস্টেম.কলেশন.জেনারিক ব্যবহার করে;

নেমস্পেস সিভিএস পার্সার {

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Order> Orders { get; set; }        
}

public class Order
{
    public int Id { get; set; }

    public int CustomerId { get; set; }
    public int Quantity { get; set; }

    public int Amount { get; set; }

    public List<OrderItem> OrderItems { get; set; }

}

public class Address
{
    public int Id { get; set; }
    public int CustomerId { get; set; }

    public string Name { get; set; }
}

public class OrderItem
{
    public int Id { get; set; }
    public int OrderId { get; set; }

    public string ProductName { get; set; }
}

class Program
{
    static void Main(string[] args)
    {

        var customerLines = System.IO.File.ReadAllLines(@"Customers.csv");
        var orderLines = System.IO.File.ReadAllLines(@"Orders.csv");
        var orderItemLines = System.IO.File.ReadAllLines(@"OrderItemLines.csv");

        CsvFactory.Register<Customer>(builder =>
        {
            builder.Add(a => a.Id).Type(typeof(int)).Index(0).IsKey(true);
            builder.Add(a => a.Name).Type(typeof(string)).Index(1);
            builder.AddNavigation(n => n.Orders).RelationKey<Order, int>(k => k.CustomerId);

        }, false, ',', customerLines);

        CsvFactory.Register<Order>(builder =>
        {
            builder.Add(a => a.Id).Type(typeof(int)).Index(0).IsKey(true);
            builder.Add(a => a.CustomerId).Type(typeof(int)).Index(1);
            builder.Add(a => a.Quantity).Type(typeof(int)).Index(2);
            builder.Add(a => a.Amount).Type(typeof(int)).Index(3);
            builder.AddNavigation(n => n.OrderItems).RelationKey<OrderItem, int>(k => k.OrderId);

        }, true, ',', orderLines);


        CsvFactory.Register<OrderItem>(builder =>
        {
            builder.Add(a => a.Id).Type(typeof(int)).Index(0).IsKey(true);
            builder.Add(a => a.OrderId).Type(typeof(int)).Index(1);
            builder.Add(a => a.ProductName).Type(typeof(string)).Index(2);


        }, false, ',', orderItemLines);



        var customers = CsvFactory.Parse<Customer>();


    }
}

}

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