C# сортировать файл с разделителями табуляции

Я видел много вопросов о сортировке табуляции с разделителями, но не смог ни понять, ни понять задачу, чтобы закончить этот кусок кода, плюс я только начинаю в C#. Я надеюсь, что кто-то может ответить на этот вопрос.

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

Category Name   Category Sub Name   Family  Sales Description   Equipment Tag   List Price  Price   ID
Fixture Type 2  Basket  Sales   B2  65  64  366589
Fixture Type 2  Basket  Sales   B2  65  64  366595
Fixture Type 2  Basket  Sales   B2  65  64  366601
Fixture Type 2  Basket  Sales   B2  65  64  366607
Fixture Type 2  Basket  Sales   B2  65  64  366613
Fixture Type 22 Rail    Sales   X1  10  10  382822
Device  Type 1  Wall    Outside Null    360 342 400604
Device  Type 3  Standard    Outside Null    180 171 400885
Device  Type 1  Wall    Outside Null    360 342 400965
Device  Type 1  Wall    Outside Null    360 342 401034
Device  Type 1  Wall    Outside Null    360 342 401303
Device  Type 3  Standard    Standard    Null    180 171 401471
Device  Type 1  Wall    Outside Null    360 342 401596
Device  Type 3  Standard    Standard    Null    180 171 401753
Device  Type 3  Standard    Standard    Null    180 171 401866
Device  Type 1  Wall    Outside Null    360 342 402189
Device  Type 3  Standard    Standard    Null    180 171 402537
Device  Type 1  Wall    Outside Null    360 342 402685
Device  Type 1  Wall    Outside Null    360 342 402930
Device  Type 1  Wall    Outside Null    360 342 402952
Device  Type 3  Standard    Standard    Null    180 171 403164
Device  Type 1  Wall    Outside Null    360 342 403234
Device  Type 3  Standard    Standard    Null    180 171 403303
Device  Type 1  Wall    Outside Null    360 342 403473
Fixture Type 4  Standard    Null    F1  140 137 406101
Fixture Type 4  Step    Null    F1  140 137 406102
Fixture Type 4  Step    Null    F1  140 137 406103
Fixture Type 4  Step    Null    F1  140 137 406104
Fixture Type 4  Step    Null    F1  140 137 406105
Fixture Type 4  Step    Null    F1  140 137 406106
Fixture Type 4  Step    Null    F1  140 137 406124
Fixture Type 4  Step    Null    F1  140 137 406125
Fixture Type 4  Step    Null    F1  140 137 406126
Fixture Type 4  Step    Null    F1  140 137 406127
Fixture Type 4  Step    Null    F1  140 137 406128
Fixture Type 4  Step    Null    F1  140 137 406129

1 ответ

Решение

Как сказано выше - вы не можете ожидать, что люди сделают всю работу за вас... но мне было скучно.

Вот простое решение в виде законченного консольного приложения, которое, скорее всего, развалится, как только вы дадите ему реальные данные, но, надеюсь, вы начнете.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
        //Read file
        var fileContents = File.ReadAllText("file.txt");

        //split on carriage returns and line feeds, remove empty entries.
        var lines = fileContents.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

        //Split each line on Tab
        var splitLines = lines.Select(l => l.Split(new[] { '\t' }, StringSplitOptions.RemoveEmptyEntries));

        //splitLines is now an array of arrays.  Each splitLine entry is a line, and each entry of each splitline element is
        //a single field... so we should be able to sort how we want, e.g. by first field then by second field:
        var sortedLines = splitLines.OrderBy(sl => sl[0]).ThenBy(sl => sl[1]);

        //put back together as TSV - put tabs back.
        var linesWithTabsAgain = sortedLines.Select(sl => string.Join("\t", sl));

        //put carriage returns/linefeeds back
        var linesWithCRLF = string.Join("\r\n", linesWithTabsAgain);

        File.WriteAllText("newFile.txt",linesWithCRLF);


    }
}
}
Другие вопросы по тегам