【问题标题】:c# sort a tab delimited filec# 对制表符分隔的文件进行排序
【发布时间】:2017-10-06 15:09:27
【问题描述】:

我已经看到很多关于对分隔的制表符进行排序的主题,但是我无法掌握或理解完成这段代码的任务,而且我刚刚开始使用 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

【问题讨论】:

  • 您不能只要求别人为您完成工作。到目前为止,您尝试了哪些对您不起作用的方法?您是否在某个地方寻找过一些您尝试过但没有奏效的解决方案?
  • 我明白你在说什么。好点子。我似乎无法在此处发布任何编码的示例,我已经在此搜索了几天。
  • 这是一个常见的谷歌搜索,我回来的所有结果都没有提供任何似乎适合我的情况的解决方案。 "读取和排序一个 csv c#"

标签: c# sorting tabs delimited


【解决方案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);


    }
}
}

【讨论】:

  • :) 你成就了我的日子。非常感谢你的提交。效果很好。我已经研究了将近一个星期,但还没有发现任何东西。
  • 我希望有人发现它和我一样有用。
  • 不客气。与其对数据进行排序,不如将其转换为可排序的数据,对其进行排序然后再将其转换回来。显然,如果源数据很大,因为它将整个东西加载到内存中,这种方法不会很好......如果你有内存问题,最好将它加载到数据库中进行排序......但它是一个周五下午有趣的小练习:)
猜你喜欢
  • 2010-11-05
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多