C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 正規表現を用いたタブ区切りテキストの抽出


(過去ログ 90 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■53739 / inTopicNo.1)  正規表現を用いたタブ区切りテキストの抽出
  
□投稿者/ OROCHI (12回)-(2010/09/25(Sat) 18:37:52)

分類:[C#] 

OS:XP
VS2005で作成

こんにちは。
現在以下のようなタブで区切られたテキストファイルから数値を抽出するためのプログラムを作っています

// 以下、テキストファイル
0.1\t0.5\t-0.009\r\n
0.2\t0.7\t0.001\r\n

ということで、以下のようなRegexを用いた正規表現を用いて行おうとしました(spritで最初やったのですが、見かけは分断できるのですが内部処理で分断できなかったので断念しました)
// 参考は:http://dobon.net/vb/dotnet/string/regex.html


// 対象のファイルを開く(sがファイルの名前)
System.IO.StreamReader cReader = (new System.IO.StreamReader(s, System.Text.Encoding.Default));

// 読み込んだ結果をすべて格納するための変数を宣言する
string stResult = string.Empty;

// 読み込みできる文字がなくなるまで繰り返す
while (cReader.Peek() >= 0)
{
   // ファイルを 1 行ずつ読み込む
   string stBuffer = cReader.ReadLine();

   // ここで、ファイルの保存形式から(数値)\tか\t(数値)を条件とすれば(ダブりはするが)抽出できると思い、以下のような条件で行いました
  // ちなみに1行目のstBufferの値は0.1\t0.5\t-0.009となります(デバッガのポップアップ)
   //(数値)\tを条件とした場合
   System.Text.RegularExpressions.Regex r2 =
                        new System.Text.RegularExpressions.Regex(
                            @"(.*?)\t",
                            System.Text.RegularExpressions.RegexOptions.IgnoreCase
                            | System.Text.RegularExpressions.RegexOptions.Singleline);
                    System.Text.RegularExpressions.MatchCollection mc2 = r2.Matches(stBuffer);

                    foreach (System.Text.RegularExpressions.Match m2 in mc2)
                    {
                        Console.WriteLine("タグ:" + m2.Groups[1].Value
                            + "\nタグ内の文字列:" + m2.Groups[2].Value
                            + "\nタグの位置:" + m2.Groups[1].Index);
                    }
  // \t(数値)を条件とした場合
  System.Text.RegularExpressions.Regex r3 =
                        new System.Text.RegularExpressions.Regex(
                            @"\t(.*?)",
                            System.Text.RegularExpressions.RegexOptions.IgnoreCase
                            | System.Text.RegularExpressions.RegexOptions.Singleline);

                    //TextBox1.Text内で正規表現と一致する対象をすべて検索
                    System.Text.RegularExpressions.MatchCollection mc3 = r3.Matches(stBuffer);

                    foreach (System.Text.RegularExpressions.Match m3 in mc3)
                    {
                        //正規表現に一致したグループと位置を表示
                        Console.WriteLine("タグ:" + m3.Groups[1].Value
                            + "\nタグ内の文字列:" + m3.Groups[2].Value
                            + "\nタグの位置:" + m3.Groups[1].Index);
                    }
}

が、何故かm3の中身が全て空になってしまい、\t(数値)の場合の検索結果を求めることができません
(m2での処理をやらなくても結果は同じ)
ということで
・m3の結果が出ない原因
・ダブらずに検索する条件
が解る方、知恵をお貸しいただけないでしょうか?


引用返信 編集キー/
■53747 / inTopicNo.2)  Re[1]: 正規表現を用いたタブ区切りテキストの抽出
□投稿者/ shu (60回)-(2010/09/25(Sat) 23:12:22)
No53739 (OROCHI さん) に返信

この正規表現でどうです?

([-0-9.]+)([^-0-9.]*)?

引用返信 編集キー/
■53748 / inTopicNo.3)  Re[1]: 正規表現を用いたタブ区切りテキストの抽出
□投稿者/ επιστημη (2563回)-(2010/09/26(Sun) 00:54:51)
επιστημη さんの Web サイト
> spritで最初やったのですが、見かけは分断できるのですが内部処理で分断できなかったので断念しました

「内部処理で分断できない」てのがどーゆーことやらわからんです。
こんなん↓じゃダメなんでしょか。

using System;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader("trial.tsv");
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                foreach (string token in line.Split('\t'))
                {
                    double value;
                    if (Double.TryParse(token, out value))
                    {
                        Console.Write("{0} ", value);
                    }
                    else
                    {
                        Console.Write("?? ");
                    }
                }
                Console.WriteLine();
            }

        }
    }
}

引用返信 編集キー/
■53824 / inTopicNo.4)  Re[2]: 正規表現を用いたタブ区切りテキストの抽出
□投稿者/ OROCHI (14回)-(2010/09/28(Tue) 00:32:27)

> 「内部処理で分断できない」てのがどーゆーことやらわからんです。
説明不足ですみません。このプログラムの真の目的は以下のようなファイルを組むことにあります

1.txt
0.1
0.2

2.txt
0.5
0.7

3.txt
-0.009
0.001

このように各要素をEXCELで言うところの列単位に分断したファイルを列分作ります。

ということで、Splitを最初使ったのですが出力だと「0.1 0.5 -0.009」という「1つの文字列」になってしまうというトラブルに悩まされました

例:
string a="0.1\t0.5\t-0.009";
string[] b = a.Split("\t")

この時のbはサイズ1となり中身は「0.1 0.5 -0.009」となります(b[0] = 0.1などとはならない)


が、バイナリエディタを引っ張ってきて中身をよくよく確認してみると、tabと思っていた部分がスペースになっていただけでした(shift-Jisで言うところの0x20)

最初の一歩から間違えていたというだけでした。すみませんでした
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -