【问题标题】:Sorting a DataTable by columns in a file按文件中的列对 DataTable 进行排序
【发布时间】:2015-01-28 12:31:50
【问题描述】:

我正在读取一个 csv 文件并对其进行排序。

我正在尝试对 DataTable 进行排序,以根据数据表中的 Bankname 为我提供输出

这是我已有的代码:

            DataTable dt = new DataTable();
            dt.Columns.Add("accountholder", typeof(string));
            dt.Columns.Add("accountnumber", typeof(int));
            dt.Columns.Add("accounttype", typeof(string));
            dt.Columns.Add("bankname", typeof(string));
            dt.Columns.Add("branch", typeof(string));
            dt.Columns.Add("amount", typeof(double));
            dt.Columns.Add("date", typeof(DateTime));

            string line;

        //CultureInfo culture = CultureInfo.InvariantCulture;
        StreamReader sr = new StreamReader(@"C:\\Test\\debitorders.csv");
        StreamWriter sw = new StreamWriter(@"C:\\Test\\output.txt");

        while ((line = sr.ReadLine()) != null)
        {
            if (line.Length > 0)
            {
                string[] inputArray = line.Split(new char[] { ',' });
                dt.Rows.Add(new object[] {
                    inputArray[0].Trim().Substring(0,1),
                    inputArray[1].Trim(),
                    long.Parse(inputArray[2].Trim()),
                    inputArray[3].Trim(),
                    inputArray[4].Trim(),
                    inputArray[5].Trim(),
                    (long)(100 * double.Parse(inputArray[6].Trim())),
                    DateTime.Parse(inputArray[7].Trim())
                });



                DateTime date = account.Field<DateTime>("date");
                string[] outputLine = new string[]{
                    initial,
                    accountholder,
                    accountnumber.ToString(),
                    accounttype,
                    bankname,
                    branch,
                    amount.ToString(),
                    date.ToShortDateString()
                };
                Console.WriteLine(string.Join(",",outputLine));
            }
        }
        Console.ReadLine();

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 使用FileHelpers 可以更轻松、更好地完成此操作。您似乎也没有关闭 StreamReader 和 StreamWriter;你最好encapsulate them in a using statement
  • 此外,您不使用 StreamWriter,而是输出到控制台。 Field&lt;string&gt;("Surname") 来自哪里?我建议重组您的代码,将其拆分为更小的位:读取原始数据,将原始数据转换为格式正确的数据,写入输出......恕我直言,此代码存在太多问题,无法指望任何人帮助你。
  • ("Surname" ) 和 ("Initial") 组成“accountholder”。代码还没有完成,所以我仍然卡住了。我只是想要一种更简单的方法
  • 您可能会卡住,因为您试图一次完成所有操作。将您的工作拆分为更小的方法,例如首先尝试将原始数据读取为易于使用的格式:自定义类而不是DataTable。然后将该“原始”数据转换为您希望看到的数据,然后将这些格式正确的数据写入文件。您发布的代码已严重损坏,我怀疑您会在这里找到可以为您工作的人。
  • 您可能想要隐藏敏感数据,例如帐号等...

标签: c# arrays linq csv text-files


【解决方案1】:

您的代码和发布的预期结果似乎不一致,因此您可能需要根据您的需要调整我的代码。但我的代码示例将向您展示如何摆脱 DataTable 和 DataRow 的东西。相反,尽可能使用 LINQ 方法和读取 csv 文件的简单辅助方法。如果您对代码有任何其他问题,请告诉我。

//reading the csv and create anonymous object for each line
var inputEntries = File.ReadLines(@"C:\\Test\\debitorders.csv")
.Select(line => 
        {
            var values = line.Split(','); 
            return new 
            {
                AccountHolder = values[0].Trim().Substring(0,1) + values[1].Trim(), 
                AccountNumber = long.Parse(values[2].Trim()),
                AccountType = values[3].Trim(),
                BankName = values[4].Trim(),
                Branch = values[5].Trim(),
                Amount = 100 * double.Parse(values[6].Trim()),
                Date = DateTime.Parse(values[7].Trim())
            };
        });

var banks = inputEntries
        .OrderBy(e => e.BankName)
        .GroupBy(e => e.BankName, e => e);

//output data
foreach(var bank in banks)
{
    //output bank header
    var AccountName = bank.Key;
    if (AccountName.Length >= 16)
    {
        AccountName = AccountName.Substring(0, 16);
    }
    else
    {
        AccountName += new string(' ', 16 - AccountName.Length);
    }
    var NumberOfAccounts = bank.Count();
    var TotalAmount = bank.Select(acc => acc.Amount).Sum();
    var Header = NumberOfAccounts.ToString("000") + TotalAmount.ToString("0000000000");
    Console.WriteLine(Header);

    //sort accounts
    var sortedAccounts = bank
                        .OrderBy( acc=> acc.AccountHolder)
                        .OrderByDescending(acc => acc.Amount);

    //output accounts
    foreach( var account in sortedAccounts)
    {
        var outputLine =
            account.AccountHolder +
            account.AccountNumber +
            account.AccountType +
            account.Amount + 
            account.Date.ToShortDateString();

        Console.WriteLine(outputLine);
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2020-12-22
    • 1970-01-01
    • 2013-04-24
    • 2015-12-24
    • 2020-08-17
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多