- PR -

TextFieldParserってASP.NET(C#)で使えるのでしょうか?

投稿者投稿内容
M太郎
会議室デビュー日: 2007/04/12
投稿数: 6
投稿日時: 2007-04-12 13:04
毎度お世話になってます。
ASP.NETで開発してます。環境はVS2005 C# WinXP_Pro_SP2 DB:ora10g です。
.NET TIPSでCSVファイルを読み込むには?[2.0のみ、C#、VB]の記事にあるとおり
FWは2.0から使用できるみたいですが、usingで使えるはずのMicrosoft.VisualBasic.FileIOが認識されず、TextFieldParserでファイル内容精査が難しい状況になってきました。やりたいことはUPLOADされたCSVファイル内容をCONSTで定義されたサイズ・型で照合し、エラーならエラー部までをSPREAD(Grid)に取込んで、エラー行のカラムにフォーカスするといったものです。
ASPでは難しいのでしょうか?またsubmitでtempフォルダにuploadされたファイルを指定フォルダ内のファイルと名前比較し、重複していればtempごとDropしたいのですが、参考事例があれば教えて頂けませんでしょうか。長々とすみませんがお願いいたします。


常連さん
会議室デビュー日: 2004/10/27
投稿数: 21
投稿日時: 2007-04-12 13:38
開発がC#とのことですから、Microsoft.VisualBasicのアセンブリが
参照設定に入っていないだけではないでしょうか?
追加してあげればusingで使えるはずですよ。

-- 追記 --
アップロードファイルの重複チェック
こんな感じでいかがでしょう?

コード:

// ファイルの重複チェックするフォルダのパス
const string CHECK_FOLDER_NAME = "C:\\Hoge";

DirectoryInfo di = new DirectoryInfo(CHECK_FOLDER_NAME);

// アップロードされたファイル名と同名のファイルが存在するかチェック
if (di.GetFiles(FileUpload1.FileName).Length > 0)
{
// フォルダ内にファイルが存在しているとフォルダを削除できないので
// 先にフォルダ内のファイルをすべて削除
FileInfo[] files = di.GetFiles();
foreach (FileInfo delete_file in files)
{
delete_file.Delete();
}

// フォルダを削除
di.Delete();
}




[ メッセージ編集済み 編集者: 怜 編集日時 2007-04-12 14:10 ]
M太郎
会議室デビュー日: 2007/04/12
投稿数: 6
投稿日時: 2007-04-13 12:24
ありがとうございます。参照ですが、using System.IO;でアセンブリ参照したんですが、最初エラーでオブジェクトブラウザでMicrosoft.VisualBasic.FileIO以下を開いたら見えるようになりました。.NETってjavaとはかなり違いますね。というか使い方がいまいち?です。

>-- 追記 --
>アップロードファイルの重複チェック
>こんな感じでいかがでしょう?

重複チェックの件、ありがとうございます。そうです、これです。助かりました。

ついでといっては何なのですが、Microsoft.VisualBasic.FileIO.TextFieldParserで取得したstring配列をspread(gridでも可)にsetする方法を探しているのですが、参考になるものをご存知でしたらご教授願いませんか?無条件でファイルを取り込む方法はわかるのですが、精査しながら1行ずつsetしたいのです。ファイルはcsvでエンコードs-jis
で、デリミタを指定するのにTextFieldParserを使用してます。
通常streamReader/Writerでの出し入れになるかと思われますが、Parserを利用して
ファイル内容精査をしながらエラー部までをspread(gridでも可)にセット表示したいのですが、ParserとstreamReaderを別々に扱う必要があります。ちょっと複雑で申し訳ありません。以下やりたいことを添付しますので、お願いできないでしょうか?

----------------------------------------------------------------------
TextFieldParser parser = new TextFieldParser(fileName,System.Text.Encoding.GetEncoding("Shift_JIS"));
using (parser) {
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
parser.HasFieldsEnclosedInQuotes = false;
parser.TrimWhiteSpace = false;
while (!parser.EndOfData)
{
string[] row = parser.ReadFields(); // 1行読み込み
// ファイル精査
if (!FileLenCheck(row))
{
continue;
}
else
{
bool chkflg = false;
break;
}
// ここでSPREADに1行セットしたい

}





常連さん
会議室デビュー日: 2004/10/27
投稿数: 21
投稿日時: 2007-04-13 15:28
私の方は今の案件で初めてSpreadSheetを使うので、いろいろ遊んでいる最中でした。
お互いがんばりましょう。
私も試行錯誤中なので、「これが標準」的な回答は出来ませんが
M太郎さんのやりたいことを実現するだけなら以下のやり方で出来ます。
以下のコードを「// ここでSPREADに1行セットしたい」の箇所に挿入してください。

コード:

// スプレッドの最終行の位置を取得
int nAddRowIndex = fpSpread1.ActiveSheet.Rows.Count;

// スプレッドシートの最終行に空行を追加
fpSpread1.ActiveSheet.Rows.Add(nAddRowIndex, 1);

// CSVの値を先頭から順番に設定
for (int fieldIndex = 0; fieldIndex < row.Length; fieldIndex++)
{
// 追加した行のCSVのフィールドの位置に対応するセルに値を設定
fpSpread1.ActiveSheet.SetValue(nAddRowIndex, fieldIndex,row[fieldIndex]);
}



これだとデータ件数が多いときに、データが描画される瞬間が目に
見えてしまいそうで心配です。
なので内容の精査がOKだった行を一度データテーブルに待避して貯めておき、
最後にバインドしてあげた方が良いのではないかと思います。
私ならそっちで実装します。

[ メッセージ編集済み 編集者: 怜 編集日時 2007-04-13 15:30 ]
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-04-13 16:42
引用:

M太郎さんの書き込み (2007-04-13 12:24) より:
ありがとうございます。参照ですが、using System.IO;でアセンブリ参照したんですが、最初エラーでオブジェクトブラウザでMicrosoft.VisualBasic.FileIO以下を開いたら見えるようになりました。.NETってjavaとはかなり違いますね。というか使い方がいまいち?です。


へーJavaだったら関係ないアセンブリ(パッケージ)を参照して呼び出せるんだぁ。
Javaって人工知能搭載だったんだね。

つか。かなり違うなんて意見はじめて聞いたよ。
少なくともこのあたりは全く一緒だと思うけどね。
M太郎
会議室デビュー日: 2007/04/12
投稿数: 6
投稿日時: 2007-04-13 17:51
怜さんいろいろとありがとうございます。
私もSpread(web2.0)使うの初めてで、四苦八苦してます。いろいろ機能ついてますと言われたのですが、QAだらけです。早速この方法で試してみますね。

>これだとデータ件数が多いときに、データが描画される瞬間が目に
>見えてしまいそうで心配です。

そうですね、最初はSpread自体を非表示にしてセットしてから表示しようかと考えていたんですが、

>一度データテーブルに待避して貯めておき、最後にバインド・・

なら良さそうでね。
何とか解決できそうな気配です。ありがとうございます。



Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-04-13 20:21
引用:

怜さんの書き込み (2007-04-13 15:28) より:
これだとデータ件数が多いときに、データが描画される瞬間が目に
見えてしまいそうで心配です。
なので内容の精査がOKだった行を一度データテーブルに待避して貯めておき、
最後にバインドしてあげた方が良いのではないかと思います。
私ならそっちで実装します。

[ メッセージ編集済み 編集者: 怜 編集日時 2007-04-13 15:30 ]


え?ASP.NET でしょ?サーバがレスポンス返していないのに途中経過が見られたりしないよ。


ぶさいくろうさん、言葉は悪いけど、ど真ん中ですよ。ちゃんと意味を考えましょう。
ヒント:using は参照ではありません。using がなくても、名前空間も指定すればいいのですから。しかし、java でいえば .class ファイルだっけ?「読んで」と言わないと読んでくれないでしょ。
_________________
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-04-13 20:54
引用:

Jittaさんの書き込み (2007-04-13 20:21) より:

ぶさいくろうさん、言葉は悪いけど、ど真ん中ですよ。ちゃんと意味を考えましょう。
ヒント:using は参照ではありません。using がなくても、名前空間も指定すればいいのですから。しかし、java でいえば .class ファイルだっけ?「読んで」と言わないと読んでくれないでしょ。


ちょっと補足を。
# これだと Jitta さんがぶさいくろうさんに向けて言っているように見える
# ので。

元々の原因はM太郎さんが TextFieldParser を
Microsoft.VisualBasic 名前空間をつけずに書いてしまっていたことが
原因なわけで(using を使って解決したようですが)、そういった現象は
Java でも同じように起こりうると思うのです。
ぶさいくろうさんが書かれているのは、そういったM太郎さん自身のミスを
Java と C# の違いという話に置き換えてはいけないよということなので
はないかと。
自分が使用するアセンブリやパッケージは C# でも Java でも「『読んで』
と言わないと読んでくれない(Jitta さん)」わけで、M太郎さんの書き方で
はまるで .NET は読んでくれないけれど、Java だったら関係のないパッ
ケージまでも自動で読んでくれるところが違うよね、と言っているように見
えるわけです。でもそうじゃないですし、ミスはミスでそう書かれた方が良
いのではないかしらん?という、ぶさいくろうさんなりの愛のあるツッコミな
のではないかと思ったり思わなかったり。

確かにぶさいくろうさんは言葉は悪いですが、言うべきことはちゃんと言っ
てくれる方だと思いますよ。華麗にスルーしてみるのもいいですが、良薬
口に苦しとも言いますし、意見は意見で真摯に受け止める姿勢も大事だと
思います。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

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