-1

私はピンチです。区切られていないテキスト ファイルを読み取っていますが、1 つの詳細を除いて成功しています。従業員 ID である文字列行内の 10 桁の数字を識別し、それをデータベースにリンクして電子メールを抽出し、その従業員に電子メールを送信する必要があります。ファイル。ファイル (すべての従業員のデータが含まれる 1 つの巨大なテキスト ファイル) を従業員ごとに個別に抽出するのに問題はありませんが、この個別のファイルを電子メールで送信する必要があります。今、私はクエリを持っていますが、それはまったく最適化されていませんが、セカンダリデータベースであり、ほとんど使用されていないため、操作に問題はありません。

 using (var cnn = new SqlConnection(connStr))
        {
            cnn.Open();
            using (var cmd = new SqlCommand("SELECT  EMail from Stubs WHERE CONTAINS (ID, @ID)", cnn))
            {
                cmd.Parameters.AddWithValue("@ID", (line));
                using (var rdr = cmd.ExecuteReader())
                {
                    if (rdr.HasRows)
                    {
                        while (rdr.Read())
                        {
   email = rdr.GetString(0);

                        }
                    }
                }
            }

読み取ったすべての行をチェックし、それをフィールドと比較しています。文字列は常にこれで構成されているため、明らかにこれは機能しません。

Acct              0100001170                              180.18   39,870.80 

そこにある 10 桁の 0100001170 を抽出し、抽出した値を使用して DB 内の列を識別し、電子メール アドレスを取得する必要があります。

その数だけを抽出するにはどうすればよいですか?出来ますか?

4

2 に答える 2

1

Jon Skeet が示唆したように、このシナリオでは正規表現が機能します。

    string id = Regex.Match(line, @"(?<=\s)\d{10}(?=\s)").Value;

lineこれが行うことは、検索パターンに基づいて入力文字列 (この場合) の特定の部分をキャプチャすることです。私がここで作成したもの"(?<=\s)\d{10}(?=\s)は、いくつかの紛らわしい要素で構成されています。

  • (?<=\s)\s - これは、空白文字の肯定的な後読みです。これは、文字列のに空白があるものすべてに一致します
  • \d - これは数字に一致します
  • {10} - これは、前のトークン (この場合) に 10 回一致することを示します\d
  • (?=\s) - 最初の項目と同様に、文字列のの空白を探します

正規表現の一致後、 でアクセスできる 10 桁の数字を含む文字列が得られます.Value

将来、正規表現に苦労している場合は、Regexrをお勧めします。これは、正規表現文字列とマッチングをテストできる Web アプリケーションであり、さまざまなトークンの非常に優れたリファレンスを提供します。

于 2013-11-14T19:21:03.697 に答える
0

これは、口座番号が各行の同じ位置にある場合に機能します。

while (rdr.Read())
{
    email = rdr.GetString(0);
    // make sure the string is long enough or you will get an index out of range exception
    if (rdr.GetString().Length() > 29)
    {
        string acctno = rdr.GetString().Substring(19, 10);
        // do something with acctno, maybe cast it to an Int64 if it is numeric
    }
}
于 2013-11-14T19:21:18.157 に答える