我有一个文件是保存为文本文件的SQL Server结果集。使用C#从文本文件中提取字段名称和最大长度
这里的文件是什么样子的样本:
RWS_DMP_ID RV1_DMP_NUM CUS_NAME
3192 3957 THE ACME COMPANY
3192 3957 THE ACME COMPANY
3192 3957 THE ACME COMPANY
我想创建一个C#程序,读取这个文件,并创建数据如下表:
Field MaxSize
----- -------
RWS_DMP_ID 17
RV1_DMP_NUM 17
CUS_NAME 42
这是字段名称及其最大长度的列表。最大长度是在下一个字段开始之前的空间字段的开始。
顺便说一句,我不关心代码的性能。这很少使用文件处理实用程序。
我解决了这个用下面的代码:
objFile = new StreamReader(strPath + strFileName);
strLine = objFile.ReadLine();
intLineCnt = 0;
while (strLine != null)
{
intLineCnt++;
if (intLineCnt <= 3)
{
if (intLineCnt == 1)
{
strWords = SplitWords(strLine);
intNumberOfFields = strWords.Length;
foreach (char c in strLine)
{
if (bolNewField == true)
{
bolFieldEnd = false;
bolNewField = false;
}
if (bolFieldEnd == false)
{
if (c == ' ')
{
bolFieldEnd = true;
}
}
else
{
if (c != ' ')
{
if (intFieldCnt < strWords.Length)
{
strProcessedData[intFieldCnt, 0] = strWords[intFieldCnt];
strProcessedData[intFieldCnt, 1] = (intCharCnt - 1).ToString();
}
intFieldCnt++;
intCharCnt = 1;
bolNewField = true;
}
}
if (bolNewField == false)
{
intCharCnt++;
}
}
strProcessedData[intFieldCnt, 0] = strWords[intFieldCnt];
strProcessedData[intFieldCnt, 1] = intCharCnt.ToString();
}
else if (intLineCnt == 3)
{
intLine2Cnt= 0;
intTotalLength = 0;
while(intLine2Cnt < intNumberOfFields)
{
intSize = Convert.ToInt32(strProcessedData[intLine2Cnt, 1]);
if (intSize + intTotalLength > strLine.Length)
{
intSize = strLine.Length - intTotalLength;
}
strField = strLine.Substring(intTotalLength, intSize);
strField = strField.Trim();
strProcessedData[intLine2Cnt, intLineCnt - 1] = strField;
intTotalLength = intTotalLength + intSize + 1;
intLine2Cnt++;
}
}
}
strLine = objFile.ReadLine();
}`enter code here`
我知道,这个代码是一个完整的破解工作。我正在寻找更好的方法来解决这个问题。
有没有更好的方法来解决这个问题?
感谢
yes!你需要将代码分解成3部分。第一个进程/将数据加载到具有3个属性文件的结构中,这里是列。然后你可以使用LINQ按照事物分组。最后你必须保存结果。 – Ankush 2012-08-03 21:23:07
@Ankush我只是想把这个分成三部分而头痛。 – codingguy3000 2012-08-06 19:49:36
我误解了这个问题。我以为你在做聚合。让我想想... – Ankush 2012-08-06 19:53:41