- PR -

文字列を比較して異なる場合だけ取得するには?

投稿者投稿内容
ネーブル
常連さん
会議室デビュー日: 2006/08/26
投稿数: 27
投稿日時: 2006-08-26 02:53
aaa
bbb
ccc
aaa

aaa
bbb
ccc
このように同じ文字列と異なる文字列が混在するファイルから、異なるものだけを
取得できるような関数は.NETでありますでしょうか?
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-08-26 07:10
引用:

ネーブルさんの書き込み (2006-08-26 02:53) より:
このように同じ文字列と異なる文字列が混在するファイルから、異なるものだけを
取得できるような関数は.NETでありますでしょうか?


で、その文字列は何処にどの様に格納されているんですか?

_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-26 09:33
引用:

ネーブルさんの書き込み (2006-08-26 02:53) より:

このように同じ文字列と異なる文字列が混在するファイルから、異なるものだけを
取得できるような関数は.NETでありますでしょうか?


System.String の配列を引数に持つメソッドを自作してください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2006-08-26 12:58
CSVファイルにODBC接続してデータを抽出する、的なところを参考にする
のもいいかも知れませんね。

あくまでも「ファイル」ならですが。
ネーブル
常連さん
会議室デビュー日: 2006/08/26
投稿数: 27
投稿日時: 2006-08-27 11:29
みなさんどうありがとうございます、そしてお世話になります。

甕星さん
引用:
で、その文字列は何処にどの様に格納されているんですか?
別ファイルに格納されていて、各行の37文字目から12文字の文字列です。


じゃんぬねっとさん
引用:
System.String の配列を引数に持つメソッドを自作してください。


Compareメッソドを使ってすっきり書きたかったのですが、いまいち使い方が理解出来ていないので下記のような冗長なコードになってしまいました。
Ahfさん
引用:
CSVファイルにODBC接続してデータを抽出する、的なところを参考にする
のもいいかも知れませんね。


検索してみましたが、少しやりたい事と外れている気がしました。

下記のようにコーディングしてみましたが、このコードですと直前の文字列と比較して異なっていれば取得できるのですが
直前より前に出現していても、取得してしまいますご教授お願いいたします。

【やりたいこと】
各行の37文字目から12文字に格納されているファイル名を配列で受けてコンボボックスの項目に追加したい。

【条件】
重複したファイル名は取得しない。

【現在の問題点・課題】
直前に出現したファイル名と異なる場合の取得は可能だが、それ以前に出現したものも取得してしまいます、良い構文が思い浮かびません。
課題として文字の比較処理をクラス化して汎用的な処理がしたい。
以下コードです

コード:
#pragma endregion
private: System::Void toolStrip1_ItemClicked(System::Object^  sender, System::Windows::Forms::ToolStripItemClickedEventArgs^  e) {
		 }
#pragma endregion
private: System::Void toolStripButton1_Click(System::Object^  sender,
	System::EventArgs^  e) {
		// 開くダイアログを表示
		OpenFileDialog^ dlg = gcnew OpenFileDialog;
		dlg->InitialDirectory = "C:\\\\\\\\";
		dlg->Filter = "All file (*.txt)|*.txt";
		dlg->RestoreDirectory = true;
		if ( dlg->ShowDialog() != 
			System::Windows::Forms::DialogResult::OK){
			return;
		}
		// コンボボックスの項目を取得する
		LoadCombBox( dlg->FileName );
	}

// コンボボックスの項目を取得
private: bool LoadCombBox( String^ path ) {
		 StreamReader^ sr = gcnew StreamReader( path,
			 System::Text::Encoding::GetEncoding( "shift-jis" ));
		 // 読込んだファイル全行の要素listnameの配列を準備
		 array<String^>^ listname = gcnew array<String^>(255);
		 // 全種類のlistnameを格納するlistkindの配列を準備
		 array<String^>^ listkind = gcnew array<String^>(255);
		 int i = 1;
		 int z = 1;
		 String^ buff;
		 // 読込んだ行の37文字目から12文字をtmpにセット
		 String^ tmp = sr->ReadLine()->Substring(37, 12);
		 // ファイルの終わりまで一行づつ読込む
		 while ((buff = sr->ReadLine()) != nullptr) {
			 listname[i] = buff->Substring(37, 12);
			 // 直前に読込んだ文字列と異なっていた場合、listkindをインクリメントし、tmpを更新する
			 if (tmp != listname[i]){
				 listkind[z] = listname[i];
				 MessageBox::Show(listkind[z]);
				 z++;
				 tmp = listname[i];
			 }
			 i++;
		 }
		 return true;
		 }
};
}

ひろえむ
会議室デビュー日: 2004/06/09
投稿数: 3
お住まい・勤務地: 東京
投稿日時: 2006-08-27 12:27
読み出す際に、コレクションクラスのListを使ってContainsで問い合わせながらAddするというのはいかが?
_________________
ひろえむ
日々是勉強@わんくま同盟:http://blogs.wankuma.com/hirom/
へなちょこ日記:http://blog.livedoor.jp/hirom1969/
ネーブル
常連さん
会議室デビュー日: 2006/08/26
投稿数: 27
投稿日時: 2006-08-27 14:05
ひろえむさん
どうもありがとうございました解決できました。

引用:
読み出す際に、コレクションクラスのListを使ってContainsで問い合わせながらAddするというのはいかが?


ビンゴしました、なんとなくですがコレクションクラスのListが使えないかと思考錯誤していたところでした、しかしContainsメッソッドを
知ら無かったので、どうしても冗長なコードになりそうでした。

おかげさまで引出しが一つ増えました。また、コードも大変すっきりしました。



コード:
// コンボボックスの項目を取得
private: bool LoadCombBox( String^ path ) {
		 StreamReader^ sr = gcnew StreamReader( path,
			 System::Text::Encoding::GetEncoding( "shift-jis" ));
		 // 読込んだファイル全行を格納する配列listnameを準備
		 array<String^>^ listname = gcnew array<String^>(255);
		 // 全種類のlistnameを格納するリスト型配列myALListを準備
		 ArrayList^ myALList = gcnew ArrayList;
		 int i = 1;
		 String^ buff;
		 // 読込んだ行の37文字目から12文字をtmpにセット
		 String^ tmp = sr->ReadLine()->Substring(37, 12);
		 myALList->Add(tmp);
		 // ファイルの終わりまで一行づつ読込む
		 while ((buff = sr->ReadLine()) != nullptr) {
			 listname[i] = buff->Substring(37, 12);
			 // リスト型配列myALListからlistnameを検索し、含まれていない場合myALListにfilenameを加える
			 if (myALList->Contains(listname[i]) == false){
				 myALList->Add(listname[i]);
				 //MessageBox::Show(listname[i]);
			 }
			 i++;
		 }
		 return true;
		 }

};
}

ネーブル
常連さん
会議室デビュー日: 2006/08/26
投稿数: 27
投稿日時: 2006-08-27 19:33
申し訳ございません、配列に項目が取得できれば容易にComboBoxのItemを設定
できると思ったのですがなぜか、読込んだ項目がComboBoxに表示出来ません引続きご教授お願いします。

下記のコードを上記の続きに加えました、デッバッガーでvarの値を見て出力も正常に
出力しています。尚、DropDownStyleのプロパティーはDropDownListに設定しています?

※ 下記のコードはComboBoxの代わりにtoolStripComboBoxを使用していますが、基本的な動作は変わらないと思っています、認識が間違っていましたら指摘してください。

コード:
// コンボボックスItemに取得した項目を代入する
toolStripComboBox1 = gcnew System::Windows::Forms::ToolStripComboBox();
	// myALListはリスト型配列なので、AddRangeメッソドが使えないためStringにキャストしてItemに代入させる
	for each (String^ var in myALList){
		toolStripComboBox1->Items->Add( var );
		Debug::WriteLine( var );
	}

スキルアップ/キャリアアップ(JOB@IT)