0

何百万行もの複数のファイルを読み込んでおり、特定の問題があるすべての行番号のリストを作成しています。たとえば、特定のフィールドが空白のままであったり、無効な値が含まれている場合です。

したがって、私の質問は、行数が 100 万を超える可能性がある数値のリストを追跡するための最も効率的な日付型は何かということです。String Builder、Lists、またはその他のものを使用すると、より効率的になりますか?

私の最終的な目標は、「特定のフィールドが 1-32、40、45、47、49-51 などで空白になっている」のようなメッセージを出力することです。 is is only 1 more I would change it from 1 to 1-2 and if it’s more than one willse a a comma. リストでは、各番号をリストに追加し、ファイルが作成されたら結合します。ただし、この場合、何百万もの数字を含む複数のリストを作成できます。

String Builder を使用して数値のリストを結合するために使用している現在のコードは次のとおりです。

string currentLine = sbCurrentLineNumbers.ToString();
string currentLineSub;

StringBuilder subCurrentLine = new StringBuilder();
StringBuilder subCurrentLineSub = new StringBuilder();

int indexLastSpace = currentLine.LastIndexOf(' ');
int indexLastDash = currentLine.LastIndexOf('-');

int currentStringInt = 0;

if (sbCurrentLineNumbers.Length == 0)
{
    sbCurrentLineNumbers.Append(lineCount);
}
else if (indexLastSpace == -1 && indexLastDash == -1)
{
    currentStringInt = Convert.ToInt32(currentLine);

    if (currentStringInt == lineCount - 1)
        sbCurrentLineNumbers.Append("-" + lineCount);
    else
    {
        sbCurrentLineNumbers.Append(", " + lineCount);
        commaCounter++;
    }
}
else if (indexLastSpace > indexLastDash)
{
    currentLineSub = currentLine.Substring(indexLastSpace);
    currentStringInt = Convert.ToInt32(currentLineSub);

    if (currentStringInt == lineCount - 1)
        sbCurrentLineNumbers.Append("-" + lineCount);
    else
    {
        sbCurrentLineNumbers.Append(", " + lineCount);
        commaCounter++;
    }
}
else if (indexLastSpace < indexLastDash)
{
    currentLineSub = currentLine.Substring(indexLastDash + 1);
    currentStringInt = Convert.ToInt32(currentLineSub);

    string charOld = currentLineSub;
    string charNew = lineCount.ToString();

    if (currentStringInt == lineCount - 1)
        sbCurrentLineNumbers.Replace(charOld, charNew);
    else
    {
        sbCurrentLineNumbers.Append(", " + lineCount);
        commaCounter++;
    }
}   
4

5 に答える 5

3

StringBuilder はあなたの目的を果たしますので、それに固執してください。行番号が必要な場合は、コードを簡単に変更できます。

于 2012-04-09T16:43:43.093 に答える
3

コードをどのように分割できるか/分割したいかによって異なります。

行順に読んでいるので、リストがまったく必要かどうかはわかりません。現在必要な出力は、ファイルが完全にスキャンされるまで何も出力できないことを意味します。ファイルのサイズは、すべてをメモリに読み込むのではなく、バッファリングされた入力を使用することを考えると、ワンパス分析フェーズも良い考えであることを示唆しています。

問題を説明するために、フィールドなどの列挙型を使いたくなるでしょう??? は空白で、それを文字列ビルダーの辞書のキーとして使用します。

とりあえずの感想として

于 2012-04-09T16:51:38.097 に答える
2

他の人が指摘しているように、私はおそらくを使用しますStringBuilder。リストのサイズを何度も変更する必要がある場合があります。の新しい実装はStringBuilderサイズを変更する必要はありません。

于 2012-04-09T17:14:26.517 に答える
2

あなたの出力は人間が読めるようになっていますか? その場合、データ構造からパフォーマンス/メモリの問題が発生するずっと前に、読み取るのが合理的な限界に達します。作業しやすいものを使用してください。

出力が機械可読であると想定されている場合、その出力は適切なデータ構造を示唆している可能性があります。

于 2012-04-09T17:09:27.810 に答える