繁体   English   中英

C#通过特定的DataRow索引拆分DataTable

[英]C# Split DataTable by specific DataRow indexes

我试图在stackoverflow上找到任何解决方案,但没有找到。

我有一个从Excel工作表获取的DataTable 该表不清楚,它包含许多子表(以标题开头)以及它们之上的其他必要信息(可能包含空行)。 例如:

Line1 : Other data...
[empty line]
Line2: Other data...
[empty line]
...................   
ColA   |   ColB   |   Type   |
------------------------------
AAA    |   BBB    |   IN     |
AAA    |   BBB    |   OUT    |
AAA    |   BBB    |   IN     |

Line1 : Other data...
[empty line]
Line2: Other data...
[empty line]
...................    
ColA   |   ColB   |   Type   |
------------------------------
AAA    |   BBB    |   IN     |
AAA    |   BBB    |   OUT    |
AAA    |   BBB    |   OUT    |

我想将数据表拆分为多个数据表,这些数据表以许多行的必要信息开始,然后是表本身,并以空行结束。 结果,我必须获取DataTable []数据类型。

我试图获取数据表各部分的最后一行的索引(如果DataRow包含“ in”或“ out”,而下一个索引包含空行),但是我不知道这是不是一个好的代码和好的解决方案为了进一步拆分数据表:

var indexes = dataTable.AsEnumerable()
    .Where(x => x.ItemArray.All(rowCell => rowCell.ToString() == string.Empty))
    .Where(
       x => dataTable.Rows[dataTable.Rows.IndexOf(x) - 1].ItemArray.Any(
             item => Regex.Match(
                   item.ToString(),
                   "^in|out$",
                   RegexOptions.IgnoreCase).Success))
    .Select(x => dataTable.Rows.IndexOf(x)).ToArray();

我有两个Where linq条件,用于检查是否存在包含“ in ”或“ out ”字的空行。

如何通过这些索引拆分DataTable 我想为此目的找到一个类似的Linq表达式 结果,我必须获得以下表格:

表格1

Line1 : Other data...
[empty line]
Line2: Other data...
[empty line]
...................   
ColA   |   ColB   |   Type   |
------------------------------
AAA    |   BBB    |   IN     |
AAA    |   BBB    |   OUT    |
AAA    |   BBB    |   IN     |

表#2

Line1 : Other data...
[empty line]
Line2: Other data...
[empty line]
...................    
ColA   |   ColB   |   Type   |
------------------------------
AAA    |   BBB    |   IN     |
AAA    |   BBB    |   OUT    |
AAA    |   BBB    |   OUT    |

我知道如何进一步处理这些数据,但是我不知道如何拆分数据表。

var selectedIndexes = from row in dataTable.AsEnumerable()
                          where (row.Text.Equals("IN") || row.Text.Equals("OUT"))
                                 && dataTable.Rows[dataTable.Rows.IndexOf(row) - 1]
                          select dataTable.Rows.IndexOf(row);

尽管这是未经测试的代码,但可能会达到目的。

编辑:

由于您的更新问题告诉我您正在处理csv文件,因此我强烈建议您使用CSVHelper Nuget。

该文档可以在这里找到:

https://joshclose.github.io/CsvHelper/

最后,我找到了解决方案。 问题的以下答案启发了我:将数据表拆分为多个固定大小的表

根据MwBakker用户的建议,我对索引标识代码进行了一些更改

var indexes = dataTable.AsEnumerable()
      .Where(x => x.ItemArray.All(rowCell => rowCell.ToString() == string.Empty))
      .Where(
         x => dataTable.Rows[dataTable.Rows.IndexOf(x) - 1].ItemArray.Any(
           item => string.Equals(item.ToString(), "In")
                   || string.Equals(item.ToString(), "Out")))
      .Select(x => dataTable.Rows.IndexOf(x)).ToArray();

我创建了扩展方法,该方法按索引将数据表的行拆分:

public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> enumerable, int[] indexes)
    {
        // Sort array.
        indexes = indexes.OrderBy(x => x).ToArray();
        var itemsReturned = 0;
        var list = enumerable.ToList();
        var count = list.Count;
        short i = 0;

        while (itemsReturned < count)
        {
            int currentChunkSize = i < indexes.Length
                                       ? Math.Min(indexes[i] - itemsReturned, count - itemsReturned)
                                       : count - itemsReturned;
            yield return list.GetRange(itemsReturned, currentChunkSize);
            itemsReturned += currentChunkSize;
            i++;
        }
    }

接下来,我做了一个foreach循环:

var dataTables = dataTable.AsEnumerable().Split(indexes)
    .Select(rows => rows.CopyToDataTable());    

foreach (var table in dataTables)
{
    // ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM