0

C# でテキスト ファイルを解析しようとしています。「Rows_affected」の値が500より大きい行番号を抽出したい。

ここに私のテキストファイルのサンプルがあります..

Query_time: 0.000268  Lock_time: 0.000097  Rows_sent: 1  Rows_examined: 38  Rows_affected: 0    Rows_read: 1
Query_time: 0.000308  Lock_time: 0.000115  Rows_sent: 0  Rows_examined: 38  Rows_affected: 500  Rows_read: 0
Query_time: 0.000169  Lock_time: 0.000057  Rows_sent: 0  Rows_examined: 38  Rows_affected: 300  Rows_read: 0
Query_time: 0.000296  Lock_time: 0.000111  Rows_sent: 0  Rows_examined: 38  Rows_affected: 50   Rows_read: 0
Query_time: 0.000238  Lock_time: 0.000081  Rows_sent: 0  Rows_examined: 38  Rows_affected: 1    Rows_read: 0
Query_time: 0.000318  Lock_time: 0.000110  Rows_sent: 1  Rows_examined: 38  Rows_affected: 600  Rows_read: 1

これは私のコードです...

int lineNumb = 0;
using (System.IO.StreamReader file = new System.IO.StreamReader(openFileDialog1.FileName)) {
    while ((line = file.ReadLine()) != null) {
        lineNumb++;
        if (line.StartsWith("# Query_time:")) {
            int value = Convert.ToInt32(line.Split(':')[5].Split(' ')[1]);
            if (value > 500) {
                listBox1.Items.Add(lineNumb.ToString() + " > " + value.ToString()); 
            }

int lineNumb = 0;
        using (System.IO.StreamReader file = new System.IO.StreamReader(openFileDialog1.FileName))
        {
            while ((line = file.ReadLine()) != null)
            {
                lineNumb++;
                if (line.StartsWith("# Query_time:"))
                {
                    int value = Convert.ToInt32(line.Split(':')[5].Split(' ')[1]);
                    if (value > 500)
                    {
                        listBox1.Items.Add(lineNumb.ToString() + " > "  + value.ToString());
                    }

                }

            }
4

4 に答える 4

3

linqを使用して、次のようなもの

static void Main()
{
    var lines = ReadAllLines(@"path\to\your\file.txt");

    var lineNumbers = lines.Where(l => Criteria(l))
                           .Select((s, i) => i);

    foreach (var i in lineNumbers)
    {
        Console.WriteLine("Criteria met on line " + i);
    }
}

static bool Criteria(string s)
{
    int i = int.Parse(Regex.Match(s, "(?<=Rows_affected: )\d+").Value);

    return i > 500;
}
于 2013-06-28T11:11:01.010 に答える
1

各行で正規表現を使用して、影響を受ける行を特定します。次に、整数値を使用して行番号を識別します。

string filename = "yourfilename";
Regex r = new Regex(@"(?<rowsaffected>(?<=Rows_affected:\s)[0-9]*)");
int lineNumber = 1;            
using(TextReader reader = new StreamReader(filename))
{
    string line = reader.ReadLine();
    while(line != null)
    {
        Match m = r.Match(line);
        int rowsaffected = int.Parse(m.Groups["rowsaffected"].Value);
        if(rowsaffected > 500)
        {                        
            // do whatever you want with your linenumber here.
        }
        lineNumber++;
        line = reader.ReadLine();
    }
}
于 2013-06-28T11:01:57.193 に答える
1

ここで私は簡単な解決策を持っています.1行ずつ読んで「 」を「 」で削除し、行を分割します。その値は分割された文字列配列の9番目のインデックスになり、単純にintに変換して値500と比較します。

それより大きい場合は true を返し、コンソール ウィンドウに行番号が表示されます。

以下は、ファイルに保存されたデータです。

Query_time: 0.000268  Lock_time: 0.000097  Rows_sent: 1  Rows_examined: 38  Rows_affected: 0    Rows_read: 1
Query_time: 0.000308  Lock_time: 0.000115  Rows_sent: 0  Rows_examined: 38  Rows_affected: 500  Rows_read: 0
Query_time: 0.000169  Lock_time: 0.000057  Rows_sent: 0  Rows_examined: 38  Rows_affected: 300  Rows_read: 0
Query_time: 0.000296  Lock_time: 0.000111  Rows_sent: 0  Rows_examined: 38  Rows_affected: 50   Rows_read: 0
Query_time: 0.000238  Lock_time: 0.000081  Rows_sent: 0  Rows_examined: 38  Rows_affected: 1    Rows_read: 0
Query_time: 0.000318  Lock_time: 0.000110  Rows_sent: 1  Rows_examined: 38  Rows_affected: 600  Rows_read: 1

//実際のコードはこちら

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace LineNumber
{
    class Program
    {
        static System.IO.StreamReader sr;
        static int linenumber = 1;
        static string line;
        static void Main(string[] args)
        {
            try
           {
                sr = new StreamReader("data.dat");
                while ((line = sr.ReadLine()) != null)
                {
                    if (FindNumber(line) == true)
                    {
                        Console.WriteLine("Line Number : " + linenumber++);
                    }
                    else
                        linenumber++;
                }
                Console.WriteLine("End of File");
                Console.ReadLine();
            }
            catch (System.Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        static bool FindNumber(string line)
        {
            string[] linesplit;
            try
            {
                if (line.Length == 0)
                    return false;
                else
                {
                    line = line.Replace("  "," ");
               }
                linesplit = line.Split(' ');
                if(int.Parse(linesplit[9]) > 500)
                    return true;
                else
                    return false;
            }
            catch (System.Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return false;
        }
    }
}

スクリーンショット: ここに画像の説明を入力

于 2013-06-28T11:46:47.797 に答える
0

ファイル形式を額面どおりに考えると、単純なオプションは、各行で "Rows_affected: " 文字列を検索し、その後ろのテキストを解析することです。

        string row = <<row from your file>>                

        int startPosition = row.IndexOf("Rows_affected: ") + "Rows_affected: ".Length;
        int endPosition = row.IndexOf(" ", startPosition);

        int numberAffected = Int32.Parse(row.Substring(startPosition, endPosition - startPosition));

その後、numberAffected を確認して、必要に応じてメモすることができます。簡潔にするために、エラー チェックは省略されています。

于 2013-06-28T11:11:18.780 に答える