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

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

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

CSVを読み込む時のスペース


(過去ログ 7 を表示中)

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

■7580 / inTopicNo.1)  CSVを読み込む時のスペース
  
□投稿者/ 超初心○ 二等兵(1回)-(2006/10/18(Wed) 13:05:10)

分類:[VB.NET] 


分類:[VB.NET] 

お世話になっています。
今CSV形式のファイルを読み込んでグリッド表示し、納期範囲を入力するとその範囲内のレコードを抽出するものを作ってます。
しかし、その元のCSVの納期部分のデータのスペースの位置がまちまちで、例えば
"06 09 01"であったり、" 06 09 01"であったり、" 06 09 01"であったりします。スペース位置が統一されていたら↓のコードで抽出できるのですが、スペースがバラバラの場合、うまくいかないです。ご教授お願いします。
'納期検索フィルタ
Private Sub btnNouki_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNouki.Click
If txtNouki1.Text = "" Or txtNouki2.Text = "" Then
MessageBox.Show("納期を入力して下さい。")
txtNouki1.Focus()
Else
'フィルタ
Dim i As Integer
Dim j As Integer
dv.Sort = "F2"
i = dv.Find(txtNouki1.Text)
j = dv.Find(txtNouki2.Text)

If (i > dv.Table.Rows.Count Or i < 0) Or (j > dv.Table.Rows.Count Or i < 0) Then
MessageBox.Show("レコードが見つかりません")
Else
Me.dv.RowFilter = "F2>='" & Me.txtNouki1.Text & " 'and F2<='" & Me.txtNouki2.Text & "'"
End If
End If
End Sub

納期範囲なのでtextboxが二つあり、ボタンが一つあります。

0
引用返信 編集キー/
■7585 / inTopicNo.2)  Re[1]: CSVを読み込む時のスペース
□投稿者/ επιστημη 大佐(234回)-(2006/10/18(Wed) 14:03:55)

分類:[VB.NET] 

> 今CSV形式のファイルを読み込んでグリッド表示し、納期範囲を入力するとその範囲内のレコードを抽出するものを作ってます。
> しかし、その元のCSVの納期部分のデータのスペースの位置がまちまちで、例えば
> "06 09 01"であったり、" 06 09 01"であったり、" 06 09 01"であったりします。

なにが言いたいのかさっぱりわかりません。
CSVはカンマを区切りとするんだからスペースとは直接の関係はないはず。

"空白で区切られたいくつかの単語を切り出すには?"ってことですか?
だとすると、CSVとの関係は?


0
引用返信 編集キー/
■7588 / inTopicNo.3)  Re[2]: CSVを読み込む時のスペース
□投稿者/ 超初心○ 二等兵(2回)-(2006/10/18(Wed) 14:52:15)

分類:[VB.NET] 

すみません。CSVは関係ないです。
問題は、読み込むデータの頭のスペースの数が統一されていないために抽出されないのです。
例えば、"06 09 01,商品A"
" 06 09 01,商品B"
" 06 09 01,商品C"
とあるとしますと、テキストボックスに頭のスペースなしで06 09 01〜06 09 02
のように範囲を入力すると商品Aしか抽出されないです。(当然かも知れませんが)
元のデータの頭のスペースをとれば問題ないのですが、データの量が多いので
できればコードを変えるだけで解決したいと思いまして、投稿しました。


0
引用返信 編集キー/
■7589 / inTopicNo.4)  Re[3]: CSVを読み込む時のスペース
□投稿者/ επιστημη 大佐(235回)-(2006/10/18(Wed) 15:04:35)

分類:[VB.NET] 

> 問題は、読み込むデータの頭のスペースの数が統一されていないために抽出されないのです。

String.Trim() が使えるんじゃないかしら。
先頭/末尾のスペースを取っ払ってくれます。

Module Module1
Sub Main()
Console.WriteLine("[{0}]", "06 09 01".Trim())
Console.WriteLine("[{0}]", " 06 09 01".Trim())
Console.WriteLine("[{0}]", "06 09 01 ".Trim())
Console.WriteLine("[{0}]", " 06 09 01 ".Trim())
Console.WriteLine("[{0}]", " 06 09 01 ".Trim())
End Sub

End Module


0
引用返信 編集キー/
■7590 / inTopicNo.5)  Re[4]: CSVを読み込む時のスペース
□投稿者/ επιστημη 大佐(236回)-(2006/10/18(Wed) 15:07:35)

分類:[VB.NET] 

> String.Trim() が使えるんじゃないかしら。
> 先頭/末尾のスペースを取っ払ってくれます。

が、途中のスペースはそのままです。
なので "06 09 01" <> " 06 09 01".Trim() です。念のため。


0
引用返信 編集キー/
■7594 / inTopicNo.6)  Re[5]: CSVを読み込む時のスペース
□投稿者/ 超初心○ 二等兵(3回)-(2006/10/18(Wed) 15:33:46)

分類:[VB.NET] 

ありがとうございます。
そのtrimメソッドを使うのは当然CSVを読み込む時ですよね?
それとも読み込んだ後に、そのカラムだけtrimメソッドを適用することは可能でしょうか?

0
引用返信 編集キー/
■7595 / inTopicNo.7)  Re[6]: CSVを読み込む時のスペース
□投稿者/ επιστημη 大佐(239回)-(2006/10/18(Wed) 15:45:37)

分類:[VB.NET] 

No7594に返信(超初心○さんの記事)
> ありがとうございます。
> そのtrimメソッドを使うのは当然CSVを読み込む時ですよね?
> それとも読み込んだ後に、そのカラムだけtrimメソッドを適用することは可能でしょうか?

オノレのアタマで考えようよぉ

" 06 09 01 , りんごとみかん, 3 4" ←大元のCSV
" 06 09 01" , " りんごとみかん" , " 3 4" ←カンマ区切りで切り出したもの
"06 09 01" , "りんごとみかん" , "3 4" ← 余計な空白を削除

…って順番で処理すりゃええんでしょーが。


0
引用返信 編集キー/
■7597 / inTopicNo.8)  Re[7]: CSVを読み込む時のスペース
□投稿者/ επιστημη 少将(240回)-(2006/10/18(Wed) 15:58:43)

分類:[VB.NET] 

ヒント(つか、まんま答)

Module Module1
Sub Main()
Dim csv As String
csv = " 06 09 01 , りんごとみかん, 3 4"
For Each token As String In csv.Split(","c)
Console.WriteLine("[{0}]", token.Trim())
Next token
End Sub
End Module


0
引用返信 編集キー/
■7598 / inTopicNo.9)  Re[7]: CSVを読み込む時のスペース
□投稿者/ 超初心○ 二等兵(4回)-(2006/10/18(Wed) 16:02:34)

分類:[VB.NET] 

それはわかるんですが、DataAdapterのfillメソッドを使ってデータを放りこんでいますので、どこでtrimを使ったらいいのか悩んでます。

0
引用返信 編集キー/
■7599 / inTopicNo.10)  Re[8]: CSVを読み込む時のスペース
□投稿者/ 超初心○ 二等兵(5回)-(2006/10/18(Wed) 16:03:44)

分類:[VB.NET] 

No7597に返信(επιστημηさんの記事)
> ヒント(つか、まんま答)
>
> Module Module1
> Sub Main()
> Dim csv As String
> csv = " 06 09 01 , りんごとみかん, 3 4"
> For Each token As String In csv.Split(","c)
> Console.WriteLine("[{0}]", token.Trim())
> Next token
> End Sub
> End Module
>
↑を見ずにレスってしまいました。
頑張ってみます。

0
引用返信 編集キー/
■7603 / inTopicNo.11)  Re[9]: CSVを読み込む時のスペース
□投稿者/ 超初心○ 二等兵(6回)-(2006/10/18(Wed) 16:45:45)

分類:[VB.NET] 

ん〜。やはりCSVを読み込む時はDataAdapterのfillメソッドなんか使わずにStreamReaderなどで読み込んだ方がいいのですかね。
どのようにsplitを使って空白を取り除くのか解りません。

0
引用返信 編集キー/
■7605 / inTopicNo.12)  Re[10]: CSVを読み込む時のスペース
□投稿者/ επιστημη 少将(242回)-(2006/10/18(Wed) 16:59:15)

分類:[VB.NET] 

> ん〜。やはりCSVを読み込む時はDataAdapterのfillメソッドなんか使わずにStreamReaderなどで読み込んだ方がいいのですかね。

前後の空白を取り除かなくていいならば、
CSVの一行をDataAdapter.Fillするコードはどうなるんでしょか?

> どのようにsplitを使って空白を取り除くのか解りません。

Splitぢゃない。Trim。


0
引用返信 編集キー/
■7607 / inTopicNo.13)  Re[11]: CSVを読み込む時のスペース
□投稿者/ 超初心○ 二等兵(7回)-(2006/10/18(Wed) 17:21:14)

分類:[VB.NET] 

↓のようにしてCSVを放り込みました。
'テーブルの作成
dataTable = oDataSet.Tables.Add("t_Data")

'DB接続文字列の設定
'oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + _
'"Data Source=G:\;" + _
'"Extended Properties=""Text;HDR=NO;FMT=Delimited"""

'コネクションの設定
'oCommand.Connection = oConn

'SQL文の設定
'Const strSelectSyain As String = _
'"SELECT * FROM data.csv "

'oCommand.CommandText = strSelectSyain

'データを取得する
'oDataAdapter.SelectCommand = oCommand

'oDataSet.Clear()
'oDataAdapter.Fill(oDataSet, "t_Data")

それから最後にdatagridにSetDataBindingでデータを入れました。
ですので、どこにtrimを使っていいのやら解らないです。

0
引用返信 編集キー/
■7608 / inTopicNo.14)  Re[12]: CSVを読み込む時のスペース
□投稿者/ επιστημη 少将(244回)-(2006/10/18(Wed) 17:39:44)

分類:[VB.NET] 

> ...
> それから最後にdatagridにSetDataBindingでデータを入れました。
> ですので、どこにtrimを使っていいのやら解らないです。

なるほど。それじゃ解決策として思いつくのはみっつ:

- 生CSVから前後の空白を取り除いたCSVに変換し、↑に食わす。
- ↑の後、グリッドのデータを取り出し/空白を削除し/差し戻す。
- ↑を諦め、CSVを一行ずつ読んでは空白を削除し、グリッドに押し込む。

…なんてことをオノレのアタマで考えておくれよぅ


0
引用返信 編集キー/
■7609 / inTopicNo.15)  Re[13]: CSVを読み込む時のスペース
□投稿者/ 超初心○ 二等兵(8回)-(2006/10/18(Wed) 17:49:03)

分類:[VB.NET] 

ありがとうございます。
やってみます。

0
引用返信 編集キー/
■7610 / inTopicNo.16)  Re[14]: CSVを読み込む時のスペース
□投稿者/ 黒い羊 二等兵(8回)-(2006/10/18(Wed) 18:32:50)

分類:[VB.NET] 

こんにちは 黒い羊です

SQLでTrimをかけても良いかもしれません

"SELECT F1,TRIM(F2) AS F2,F3 FROM data.csv "

上記のようにすれば出来ると思います。
カラム数が分からないので適当にしていますが
実際のカラム数に当てはめて下さい。
フィールド名は上記でOKだと思います。

宜しければ試してみて下さい。

0
引用返信 編集キー/
■7618 / inTopicNo.17)  Re[15]: CSVを読み込む時のスペース
□投稿者/ Jitta 准尉(109回)-(2006/10/18(Wed) 21:22:09)
Jitta さんの Web サイト

分類:[VB.NET] 

> 納期範囲を入力するとその範囲内のレコードを抽出するもの
 私は、こっちに突っ込みたいぞ。

 “納期”ということは、日付なんですよね?
 入力されたものや、CSV ファイルの、“納期”としている情報が、日付として妥当かどうかは、どうやって検証しているのでしょうか?

 っつうか、
> テキストボックスに頭のスペースなしで06 09 01〜06 09 02 のように範囲を入力すると商品Aしか抽出されないです。
検証してないよね?
いいの?ユーザの入力を信用して?現に日付が入るところ、桁数があっていないんですよね?

 で、これをちゃんと検証するようにすると、スペースがどの様に何個入っていようが、関係なくなるはず。


> Me.dv.RowFilter = "F2>='" & Me.txtNouki1.Text & " 'and F2<='" & Me.txtNouki2.Text & "'"
 あなたは、「開発者」ですか?
それとも、他の職業の片手間に開発もやっている「専門職」ですか?
「開発者」なら、こんな書き方は止めましょう。
文字列の、「以上」「以下」って、なんですか?
"06 09 30" と、"06 09 30" の大小関係は、どの様になって欲しいですか?
あるいは、日付を表す文字列なら、こんな書き方も出来ます。"Sept. 30, 2006"
データを「日付」と解釈するなら、同じになって欲しいですよね。
でも、誰が「日付」と解釈するのですか?
コンピュータは、「日付」と解釈しますか?
今、“たまたま”期待通りに動いているだけではないですか?


> If (i > dv.Table.Rows.Count Or i < 0) Or (j > dv.Table.Rows.Count Or i < 0) Then
 後ろは j の間違いだろうというのはいいとして、i, j が Rows.Count より大きくなることって、あるんですか?
Or で検査しているため、必ずすべての条件がチェックされます。
処理時間はわずかですが、冗長な処理を入れることで、コードの可読性も下げてしまっています。
現に、タイプミスしているし。
→ If (i < 0) OrElse (j < 0) Then


0
引用返信 編集キー/
■7619 / inTopicNo.18)  Re[16]: CSVを読み込む時のスペース
□投稿者/ Jitta 准尉(110回)-(2006/10/18(Wed) 21:23:11)
Jitta さんの Web サイト

分類:[VB.NET] 

No7618に返信(Jittaさんの記事)
> "06 09 30" と、"06 09 30" の大小関係は、どの様になって欲しいですか?


0
引用返信 編集キー/
■7625 / inTopicNo.19)  Re[16]: CSVを読み込む時のスペース
□投稿者/ επιστημη 少将(249回)-(2006/10/18(Wed) 22:58:28)
επιστημη さんの Web サイト

分類:[VB.NET] 

>>納期範囲を入力するとその範囲内のレコードを抽出するもの
>  私は、こっちに突っ込みたいぞ。

確かに。

ヒトが入力するのであればその値を用いる前に入力値が妥当/正当かの検証を行うべきだし、また必要に応じて正規化(余分な空白を取り除くとか)できるやろし。

CSVについても同じことが言えます。ヒトが入力したものを信じてベタにCSVに放り込んじゃいけないし、もしそうなら同様に検証/正規化するのがスジ。


0
引用返信 編集キー/
■7628 / inTopicNo.20)  Re[16]: CSVを読み込む時のスペース
 
□投稿者/ 超初心○ 二等兵(9回)-(2006/10/19(Thu) 09:35:45)

分類:[VB.NET] 



ありがとうございました。色々勉強になります。


0
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -