加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 具有动态列数的平面文件规范化

发布时间:2020-12-15 21:48:56 所属栏目:百科 来源:网络整理
导读:我有一个平面文件,不幸的是动态列结构.值中包含一个值,层次结构中的每个层都有自己的列.例如,我的平面文件可能类似于: StatisticID|FileId|Tier0ObjectId|Tier1ObjectId|Tier2ObjectId|Tier3ObjectId|Status1234|7890|abcd|efgh|ijkl|mnop|Pending... 第二
我有一个平面文件,不幸的是动态列结构.值中包含一个值,层次结构中的每个层都有自己的列.例如,我的平面文件可能类似于:

StatisticID|FileId|Tier0ObjectId|Tier1ObjectId|Tier2ObjectId|Tier3ObjectId|Status
1234|7890|abcd|efgh|ijkl|mnop|Pending
...

第二天相同的饲料可能类似于:

StatisticID|FileId|Tier0ObjectId|Tier1ObjectId|Tier2ObjectId|Status
1234|7890|abcd|efgh|ijkl|Complete
...

问题是,我并不关心所有层级;我只关心最后(底部)层的id,以及不属于层列的所有其他行数据.我需要将feed标准化为类似于此的东西以注入关系数据库:

StatisticID|FileId|ObjectId|Status
1234|7890|ijkl|Complete
...

什么是一种有效的,易于阅读的机制,用于确定最后一层的对象id,并按照描述组织数据?我所做的每一次尝试都让我感到尴尬.

我做过的一些事情:

>我试图检查正则表达式模式的列名,识别分层的列,按名称降序排序,然后选择第一条记录……但是我这样丢失了序数列号,所以没有看起来不错.
>我已将我想要的列放入IDictionary< string,int>要引用的对象,但是再次可靠地收集动态列的序数是一个问题,而且这似乎是非常不具有效果的.

解决方法

几年前我遇到了一个类似的问题.我使用字典来映射列,它不漂亮,但它工作.

首先制作一个词典:

private Dictionary<int,int> GetColumnDictionary(string headerLine)
    {
        Dictionary<int,int> columnDictionary = new Dictionary<int,int>();
        List<string> columnNames = headerLine.Split('|').ToList();

        string maxTierObjectColumnName = GetMaxTierObjectColumnName(columnNames);
        for (int index = 0; index < columnNames.Count; index++)
        {
            if (columnNames[index] == "StatisticID")
            {
                columnDictionary.Add(0,index);
            }

            if (columnNames[index] == "FileId")
            {
                columnDictionary.Add(1,index);
            }

            if (columnNames[index] == maxTierObjectColumnName)
            {
                columnDictionary.Add(2,index);
            }

            if (columnNames[index] == "Status")
            {
                columnDictionary.Add(3,index);
            }
        }

        return columnDictionary;
    }

    private string GetMaxTierObjectColumnName(List<string> columnNames)
    {
        // Edit this function if Tier ObjectId is greater then 9
        var maxTierObjectColumnName = columnNames.Where(c => c.Contains("Tier") && c.Contains("Object")).OrderBy(c => c).Last();

        return maxTierObjectColumnName;
    }

之后它只是通过文件运行:

private List<DataObject> ParseFile(string fileName)
    {
        StreamReader streamReader = new StreamReader(fileName);

        string headerLine = streamReader.ReadLine();
        Dictionary<int,int> columnDictionary = this.GetColumnDictionary(headerLine);

        string line;
        List<DataObject> dataObjects = new List<DataObject>();
        while ((line = streamReader.ReadLine()) != null)
        {
            var lineValues = line.Split('|');

            string statId = lineValues[columnDictionary[0]];
            dataObjects.Add(
                new DataObject()
                {
                    StatisticId = lineValues[columnDictionary[0]],FileId = lineValues[columnDictionary[1]],ObjectId = lineValues[columnDictionary[2]],Status = lineValues[columnDictionary[3]]
                }
            );
        }

        return dataObjects;
    }

我希望这有助于(甚至一点点).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读