我有一個文件是保存爲文本文件的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