« 2012年7月 | トップページ | 2013年8月 »

2013年5月

2013年5月31日 (金)

文字列の分解

文字列を分解したい。C#、ASP.NET。.NET Framework 3.5。
しかしstringクラスのsplit()では、区切り文字が失われてしまう。
分解したものを単純に再度くっつけると元の文字列が得られるような分解をしたい。

ごく簡単に調べたけど見当たらなかった。ので作った。
もし車輪の再発明ならぜひ教えてください。すでにあるやつのほうが絶対にいろいろよさそう。
ぎっとはぶにはそういうの置いてあるのかなぁ。

/// <summary>
/// 文字列を分解する、区切り文字も保持する
/// </summary>
/// <param name="s">分解対象文字列</param>
/// <param name="pat" />区切り文字のパターン(正規表現)</param>
/// <returns>分解された文字列配列</returns>
public string[] splitPerfect(string s, string pat)
{
	ArrayList arrList = new ArrayList();
	Regex r;
	Match m;

	r = new Regex(pat);

	while (s.Length > 0)
	{
		m = r.Match(s);
		if (!m.Success)	//--見つからなかったら抜ける
		{
			arrList.Add(s);
			break;
		}
		arrList.Add(m.Value.Substring(0, (m.Value.Length >= 2) ? m.Value.Length - 1 : m.Value.Length));
		s = s.Substring((arrList[arrList.Count-1] as string).Length);
	}
	return (string[])arrList.ToArray(typeof(string));
}

くっそ遅そう。実際にはどうかわかんないですけど。測定するつもりもない。

本体としては以上なんですが、目的としてはちょっとばかしSQL文を分解したいというものなので、こういうのをくっつけまして。

/// <summary>
/// SQLを分解するための区切り文字パターン(正規表現)
/// </summary>
/// <remarks>()[]+*-/><=(半角スペース),.(タブ)"':; のどれかと一致するように記述</remarks>
public string strSqlSplitPattern = ".*?[\\(\\)\\[\\]\\+\\*-/><= ,\\.\\t\"\':;]";

/// <summary>
/// 文字列を分解する、区切り文字も保持する
/// </summary>
/// <remarks>区切り文字のパターンとしてstrSqlSplitPatternを使う</remarks>
/// <param name="s">分解対象文字列</param>
/// <returns>分解された文字列配列</returns>
public string[] splitPerfect(string s)
{
	return splitPerfect(s, strSqlSplitPattern);
}

SELECT COL1, COL2 FROM EMPLOYEE WHERE COL3 = 'hogehoge' AND (0=1 OR 1>= 0)

というSQL文があったとして、

SELECT

COL1
,

COL2

FROM

EMPLOYEE

WHERE

COL3

=

'
hogehoge
'

AND

(
0
=
1

OR

1
>
=

0
)

という組に分けてくれるよ。

テストコード。

string example = 好きなSQL文を入れてね!

string[] tmppp= fugaClass.splitPerfect(example);

System.Text.StringBuilder sb = new System.Text.StringBuilder();
for (int i = 0; i < tmppp.Length; i++)
{
	sb.Append(tmppp[i]);
}
if (sb.ToString().Equals(example))
{
	string result = "Match!";
}

当然ながらすべからく適当なのでうまいことやってくださいね。
上に載せたSQLの区切り文字パターン strSqlSplitPattern も、こっちの要件で適当に作ってあるので、自分の用途に合うように考えてから使ってください。
' クオテーションの中に書かれた文字列とかも考慮しないでぶった切っちゃうからね。
‥‥えっそれ大丈夫なんかいな。うーんもうちょっと考えないといかんのかな。

OracleだとかSQL Serverだとかの差も考えてくださいね。
正規表現勉強してね。僕も全然詳しくなくて好きじゃないんだけど仕方ない。

この辺を参考にしてコピペった部分もあります。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1394207798
http://freelancer.yoka-yoka.jp/e337117.html

2013年5月16日 (木)

Webアプリで謎のエラー 0x80070057

最初に言っておこう。この 0x80070057 というエラーコード自体はいろんなもので使われているっぽいので、ちゃんと目的のものを探さないとダメっぽいですよ。
http://support.microsoft.com/kb/982736/ja
http://d.hatena.ne.jp/babydaemons/20080408/1207656965
http://blogs.msdn.com/b/d99/archive/2012/04/06/10291428.aspx


今回以下と同様に VisualStudio / .NET Framework / IIS でのエラーだとしても、また違う原因の場合もあるということですね。


で、Visual Studio 2008 でASP.NET Webアプリケーションの開発をしていて、突然アセンブリが読み込めないとかいうエラーが出るようになったという話です。


僕じゃないんですけど。
なんかいない間に建物で突然の停電があったそうで。20分くらい。
停電復旧後に、デバッグ実行したら次のようなエラーが出るようになったらしい。


「ファイルまたはアセンブリ 'hogehoge'、またはその依存関係の1つが読み込めませんでした。パラメーターが間違っています。(HRESULTからの例外: 0x80070057(E_INVALIDARG))」


画面イメージからの手打ちなんで、全角半角やスペースありなしの違いはあると思います。検索で来れた人おめでとう。


でまぁいろいろ調べたんですが、結論としてはここ(英語) http://blkarwasara.blogspot.jp/2011/07/hresult-0x80070057-einvalidarg-on-debug.html のような感じで C:\Users\[username]\AppData\Local\Temp\Temporary ASP.NET Files\ (Windows 7の場合)以下のファイルを消したら直った。


実際、エラー画面の下部には
「ログ: 新しい URL file:///c:/Users/xxxxxxxx/AppData/Local/Temp/Temporary ASP.NET Files/root/nnnnnnnn/mmmmmmmm/hogehoge.DLL をダウンロードしようとしています。」
的なメッセージも出ている。
しかしこれに従って、該当ファイルを探しても実際にはなかった。
微妙に違うフォルダにそれっぽいDLLがあったので、それを単発で消した。
すると hogehoge 部分が別DLLになったので、そっちも探して消してみた。
でもまだダメ。
なので調べて、上記英語サイトを見つけて、今回対象のPCには Temporary ASP.NET Files 以下にいろんなフォルダが作られていたので、上記メッセージで指定されている root 以下だけ削除しました。
テンポラリなんで全部消しても問題ないはずですけど、root の下も今回関連のものやその他明らかに消していいものだけだなというのを、ファイル名で判断してから消しました。


あーなんか前後しますけど、まずは当該DLLが壊れたのかなと思ったので、ネットワーク上に置いてあったDLLをbinフォルダにコピーしてきて、参照設定やり直して、ということもやってみてました。
でもそれではダメだったので、上記単発消しを試し、それでもいまいちダメなので調べて全消し、という流れでした。


停電でなんかテンポラリフォルダがおかしくなったんだろう。
スキャンディスクやった方がいいですよと言っておこう。

« 2012年7月 | トップページ | 2013年8月 »

AmazonSearch


最近のトラックバック

無料ブログはココログ