gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:47:54 25 4
gpt4 key购买 nike

我有一个带有不幸的动态列结构的平面文件。值层次结构中有一个值,层次结构中的每一层都有自己的列。例如,我的平面文件可能类似于:

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,以及所有其他不属于层列的行数据。我需要将提要规范化为类似于此的内容以注入(inject)关系数据库:

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;
}

我希望这会有所帮助(哪怕是一点点)。

关于c# - 具有动态列数的平面文件规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15390719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com