5

.txtファイルからデータを読み取り、クエリを使用して各行をテーブルに挿入する必要があるプロジェクトを実行しています。

たとえば、テキストファイルの内容は次のようになります。

11111

1111x

22222

2222x

33333

3333x

等々。

代替行がほぼ反復していることがわかるように、代替行を削除して、使用可能なデータが次のようになるようにします。

11111

22222

33333

その後、残りのコードを処理します。

それができる方法はありますか?

これまで、これを取得するために配列リストを使用してきました

using (StreamReader sr = new StreamReader(Server.MapPath("03122013114450.txt"), true))
        {

            string txtValues = sr.ReadToEnd();
            string[] txtValuesArray1 = Regex.Split(txtValues, "\r\n");



            ArrayList array = new ArrayList();
            foreach (string value in txtValuesArray1)
            {
                array.Add(value);
            }

            for (int i = 0; i < array.Count; i++)
            {
                if (array.Count % 2 != 0)
                    array.RemoveAt(i + 2);
                else
                    array.RemoveAt(i + 1);
            }
        }

基本的な考え方は、テキストファイルのarraylistのインデックスから代替行を削除することです。

4

4 に答える 4

2

迅速な最適化、

static IEnumerable<string> OddLines(string path)
{
    var flipper = true;

    foreach (var line in File.ReadLines(path))
    {
        if (flipper) yield return line;
        flipper = !flipper;
    }
}

このように使用できます

var oddlines = OddLines(Server.MapPath("03122013114450.txt")); 

または、さらに簡単

var oddlines = File.ReadLines(Server.MapPath("03122013114450.txt"))
                   .Where((l, i) => i % 2 == 0);
于 2013-03-14T12:15:52.303 に答える
2

LINQでこれを試してみました

string[] lines = File.ReadAllLines("your_file_name");
var result = lines.Where((s, idx) => idx % 2 == 0);

もちろん、ファイルが非常に大きい場合は、行ごとに作業し、読み取り中に不要な行をスキップする必要があります

于 2013-03-14T12:17:50.337 に答える
1

通常は、ディスク上のすべてのデータをメモリにバッファリングするのではなく、一度に1行ずつファイルを読み取ります。それが2GBのテキストファイルであるかどうかを考えてみてください(それほど珍しい問題ではありません)。処理を開始する前に、最初に2GBがロードされるのを待っています。

ulong count = 0;
using (StreamReader sr = new StreamReader(Server.MapPath("03122013114450.txt"), true))
{
   while (!sr.EndOfStream) {
       count++;
       String line = sr.ReadLine();
       if ((count % 2) == 0) {
           // do additional processing here
           // like insert row into database
       }
    }
}

(私のC#はさびています。)

于 2013-03-14T12:15:10.807 に答える
1

別の最適化:

using (var sr = new StreamReader(Server.MapPath("03122013114450.txt"), true))
{
    var line = sr.ReadLine();
    while (line != null)
    {
        // Do stuff here. Add to the list, maybe?

        if (sr.ReadLine()!= null) //read the next line and ignore it.
            line = sr.ReadLine();
    }
}

偶数行ではなく奇数行を無視する場合line = sr.ReadLine();は、whileループの最後から最初に移動します。

于 2013-03-14T12:19:08.070 に答える