Подтвердить что ты не робот

Очень простой С# CSV-ридер

Я хотел бы создать массив из файла CSV.

Это примерно так же просто, как вы можете себе представить, файл CSV будет иметь только одну строку и следующие значения:

Device, SignalStrength, Location, Time, Age.

Я хотел бы поместить эти значения в один размерный массив.

Я пробовал некоторые примеры, но все они были сложнее, чем требовалось.

4b9b3361

Ответ 1

Если существует только одна строка, выполните следующее:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        String[] values = File.ReadAllText(@"d:\test.csv").Split(',');
    }
}

Ответ 2

Вы можете попробовать что-то вроде приведенного ниже фрагмента LINQ.

string[] allLines = File.ReadAllLines(@"E:\Temp\data.csv");

    var query = from line in allLines
                let data = line.Split(',')
                select new
                {
                    Device = data[0],
                    SignalStrength = data[1],
                    Location = data[2], 
                    Time = data[3],
                    Age = Convert.ToInt16(data[4])
                };

ОБНОВЛЕНИЕ:. С течением времени все складывалось. На данный момент я бы предпочел использовать эту библиотеку http://www.aspnetperformance.com/post/LINQ-to-CSV-library.aspx

Ответ 3

Вот простая функция, которую я сделал. Он принимает строку CSV строки и возвращает массив полей:

Он отлично работает с файлами CSV сгенерированных Excel и многими другими вариантами.

    public static string[] ParseCsvRow(string r)
    {

        string[] c;
        string t;
        List<string> resp = new List<string>();
        bool cont = false;
        string cs = "";

        c = r.Split(new char[] { ',' }, StringSplitOptions.None);

        foreach (string y in c)
        {
            string x = y;


            if (cont)
            {
                // End of field
                if (x.EndsWith("\""))
                {
                    cs += "," + x.Substring(0, x.Length - 1);
                    resp.Add(cs);
                    cs = "";
                    cont = false;
                    continue;

                }
                else
                {
                    // Field still not ended
                    cs += "," + x;
                    continue;
                }
            }

            // Fully encapsulated with no comma within
            if (x.StartsWith("\"") && x.EndsWith("\""))
            {
                if ((x.EndsWith("\"\"") && !x.EndsWith("\"\"\"")) && x != "\"\"")
                {
                    cont = true;
                    cs = x;
                    continue;
                }

                resp.Add(x.Substring(1, x.Length - 2));
                continue;
            }

            // Start of encapsulation but comma has split it into at least next field
            if (x.StartsWith("\"") && !x.EndsWith("\""))
            {
                cont = true;
                cs += x.Substring(1);
                continue;
            }

            // Non encapsulated complete field
            resp.Add(x);

        }

        return resp.ToArray();

    }

Ответ 4

Это то, что я использовал в проекте, анализирует одну строку данных.

    private string[] csvParser(string csv, char separator = ',')
    {
        List <string> = new <string>();
        string[] temp = csv.Split(separator);
        int counter = 0;
        string data = string.Empty;
        while (counter < temp.Length)
        {
            data = temp[counter].Trim();
            if (data.Trim().StartsWith("\""))
            {
                bool isLast = false;
                while (!isLast && counter < temp.Length)
                {
                    data += separator.ToString() + temp[counter + 1];
                    counter++;
                    isLast = (temp[counter].Trim().EndsWith("\""));
                }
            }
            parsed.Add(data);
            counter++;
        }

        return parsed.ToArray();

    }

http://zamirsblog.blogspot.com/2013/09/c-csv-parser-csvparser.html

Ответ 5

Эта фиксированная версия кода выше запоминает последний элемент строки CVS; -)

(протестирован с файлом CSV с 5400 строками и 26 элементами по строке)

   public static string[] CSVRowToStringArray(string r, char fieldSep = ',', char stringSep = '\"')  {
            bool bolQuote = false;
            StringBuilder bld = new StringBuilder();
            List<string> retAry = new List<string>();

            foreach (char c in r.ToCharArray())
                if ((c == fieldSep && !bolQuote))
                {
                    retAry.Add(bld.ToString());
                    bld.Clear();
                }
                else
                    if (c == stringSep)
                        bolQuote = !bolQuote;
                    else
                        bld.Append(c);

            /* to solve the last element problem */
            retAry.Add(bld.ToString()); /* added this line */
            return retAry.ToArray();
        }

Ответ 6

Мое решение обрабатывает кавычки, переопределяет поля и разделители строк и т.д. Это короткий и сладкий.

    public static string[] CSVRowToStringArray(string r, char fieldSep = ',', char stringSep = '\"')
    {
        bool bolQuote = false;
        StringBuilder bld = new StringBuilder();
        List<string> retAry = new List<string>();

        foreach (char c in r.ToCharArray())
            if ((c == fieldSep && !bolQuote))
            {
                retAry.Add(bld.ToString());
                bld.Clear();
            }
            else
                if (c == stringSep)
                    bolQuote = !bolQuote;
                else
                    bld.Append(c);

        return retAry.ToArray();
    }

Ответ 7

Прежде всего, нужно понять, что такое CSV и как его записать.

  • Каждая следующая строка (/r/n) - следующая строка таблицы.
  • Элементы "Таблица" разделяются символом разделителя. Чаще всего используются символы \t или ,
  • Каждая ячейка может содержать этот символ разделителя (ячейка должна начинаться с символа кавычек и заканчивается этим символом в этом случае)
  • Каждая ячейка может содержать /r/n sybols (ячейка должна начинаться с символа кавычек и заканчивается этим символом в этом случае)

Некоторое время назад я написал простой класс для чтения/записи CSV на основе стандартной библиотеки Microsoft.VisualBasic.FileIO. Используя этот простой класс, вы сможете работать с CSV как с массивом размеров.

Простой пример использования моей библиотеки:

Csv csv = new Csv("\t");//delimiter symbol

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

var row1Cell6Value = csv.Rows[0][5];

csv.AddRow("asdf","asdffffff","5")

csv.FileSave("c:\\file2.csv");

Вы можете найти мой класс по следующей ссылке и изучить, как это написано: https://github.com/ukushu/DataExporter