LINQ + CSV: как разделить файл CSV по заголовкам в C# - PullRequest
0 голосов
/ 26 марта 2020

это мой первый пост здесь. Я уже пытался гуглить и смотреть в stackoverflow, но я не нашел решения, подходящего для моей проблемы, поэтому я надеюсь, что кто-то может помочь мне здесь.

Итак, у меня есть CSV-файл с 3 столбцами: ID, Имя, PreferredFood

И я хочу разделить этот CSV-файл на несколько CSV-файлов, по одному файлу для каждого типа пищи. Таким образом, один файл будет содержать все идентификаторы и имена людей, которые любят пиццу, например.

Я даже не уверен, как здесь работать с CSV, я начал с использования строки [] [], но я не думаю, что это лучший способ сделать это. Но это уже другая история ... Пока я был бы очень признателен, если бы кто-нибудь мог помочь мне с LINQ и как это заявление выглядело бы.

Заранее спасибо и хорошего дня :) csharpdev

Ответы [ 3 ]

0 голосов
/ 26 марта 2020

Я бы сделал это следующим образом:

var csv = @"A,B,C
X,Y,Z
Q,W,E
R,S,Z";

var lines = csv.Split(new [] { Environment.NewLine }, StringSplitOptions.None);

var results =
    from line in lines.Skip(1)
    let parts = line.Split(',')
    group line by parts[2] into foods
    select new
    {
        food = foods.Key,
        csv =
            String.Join(
                Environment.NewLine,
                new [] { lines[0] }.Concat(foods))
    };

Это дает мне:

results

Вы могли бы выписать каждый CSV, как это:

foreach (var result in results)
{
    File.WriteAllText($"{result.food}.csv", result.csv);
}
0 голосов
/ 26 марта 2020

CSV File

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

using System;
using System.Linq;
using System.IO;

namespace ConsoleApp
{
    class Program
    {
        static string path = @"path\to\csv_file.csv";

        public class Person
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string PreferredFood { get; set; }
            public override string ToString()
            {
                // Matches what a csv line looks like
                return $"{Id},{Name},{PreferredFood}";
            }
        }

        static void Main(string[] args)
        {
            var lines = File.ReadAllLines(path); // Read all lines of a csv file
            var groups = lines
                .Skip(1) // Skip header line
                .Select(line => line.Split(',')) // Split by comma
                .Select(column => new Person
                {
                    Id = int.Parse(column[0]),
                    Name = column[1],
                    PreferredFood = column[2]
                })// Convert to Person
                .GroupBy(person => person.PreferredFood); // Group by preferred food 

            foreach (var group in groups)
            {
                var foodPath = Path.Combine(Path.GetDirectoryName(path), $"{group.Key}.csv"); // Create unique filename for each csv
                var foodOutput = new string[] { lines[0] } // Add header line
                    .Concat(group.ToList().Select(person => person.ToString())); // Concatenate all other lines
                File.WriteAllLines(foodPath, foodOutput); // Write output to csv foodPath
            }               

            Console.ReadKey();
        }
    }
}
0 голосов
/ 26 марта 2020

Взгляните сюда:


//class for the data:
class MyClass
{
    public string ID;
    public string Name;
    public string PreferredFood;
};

//mock data csv:
string csv = "A\tB\tc\nX\tY\tZ\n";

static void Main(string[] args)
{   
    //Spilt csv by End-of-Line separator:
    var lines   = csv.Split('\n');
    var mylist = new List<MyClass>();

    foreach( var line in lines )
    {
        //Spilt line by column separator:
        var columns = line.Split('\t');

        //create a new MyClass-object and insert the data into it 
        var s= new MyClass();
        s.ID            = columns[0];
        s.Name          = columns[1];
        s.PreferredFood = columns[2];

        //add the object into a list:
        mylist.Add( s );
    }

    //group the data using LinQ:
    var groups = mylist.GroupBy( x => x.PreferredFood );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...