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

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

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

Re[2]: csvデータを読込んで、csvデータ書出


(過去ログ 124 を表示中)

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

■74021 / inTopicNo.1)  csvデータを読込んで、csvデータ書出
  
□投稿者/ takuya (4回)-(2014/11/23(Sun) 23:41:43)

分類:[VB.NET/VB2005 以降] 

Microsoft Visual Basic 2010 ExpressでCSVを読み込んで、その値の和や差をcsvファイル形式に出力しています。
writer.Write(field(1) + field(5))の部分で、field(1)が200 field(5)が1000 の場合に、出力される値が
2001000となってしまいます。
プラスがアンドの役目になるためだと思います。
これを回避するため、 field(1)*1 + field(5)*1 などと記述しています。
ただ、これは正しいのでしょうか?我流ですが、ほかにスマートな方法はないのでしょうか?



PsDataIn = System.IO.File.ReadAllLines( "C:\nikkei.csv", enc)
PiDataCnt = PsDataIn.Length '最終行を取得


For x = midasi - 1 To PiDataCnt - 1
   line = PsDataIn(x) '1行読み込む
field = line.Split(",") 'カンマで分割
If MYtype = field(0) Then

MYpath1 = "D:\uriage.csv" 'ダイコクZA形式 作成ファイルパス
writer = My.Computer.FileSystem.OpenTextFileWriter(MYpath1, False, System.Text.Encoding.Default)
writer.Write("現金残,売上")
writer.Write(field(7) - field(2))'現金残
writer.Write(field(1) + field(5))'売上
writer.WriteLine(",")
writer.Close()

   End If
Next x
引用返信 編集キー/
■74022 / inTopicNo.2)  Re[1]: csvデータを読込んで、csvデータ書出
□投稿者/ WebSurfer (396回)-(2014/11/24(Mon) 01:22:44)
No74021 (takuya さん) に返信

field の定義が見当たりませんが String 型の配列ですよね?

ということは field(1)、field(5) は String 型で、それぞれ "200" と "1000" なので、
field(1) + field(5) は "200" + "1000" となって、結果は "2001000" になるのは理解で
きるでしょうか?

それが理解できないというと、ホントの初歩の初歩からの話になってしまい、お互いある
程度知識があることが前提の掲示板でやりとりして解決するのは難しそうです。
引用返信 編集キー/
■74023 / inTopicNo.3)  Re[2]: csvデータを読込んで、csvデータ書出
□投稿者/ takuya (5回)-(2014/11/24(Mon) 01:48:42)
返答ありがとうございます。

プラスがアンドになるのは理解しています。
本で勉強した際も、自動判別で足し算にするのか、文字を結合すると書いてあった記憶があります。
その足し算か結合かを明示的に記述することはできないのでしょうか?
引用返信 編集キー/
■74024 / inTopicNo.4)  Re[1]: csvデータを読込んで、csvデータ書出
□投稿者/ shu (632回)-(2014/11/24(Mon) 01:57:16)
No74021 (takuya さん) に返信
> これを回避するため、 field(1)*1 + field(5)*1 などと記述しています。
> ただ、これは正しいのでしょうか?我流ですが、ほかにスマートな方法はないのでしょうか?
>
数値であることが保証されているなら
CDec(field(1)) + CDec(field(5))

さらにIntegerの範囲であることが保証されているなら
CInt(field(1)) + CInt(field(5))

このように明示的に型変換を行ってあげるのがよいです。
*1だとその文の意味を他の人がパッと見で型変換をする為に行っていることが分かりにくいです。
引用返信 編集キー/
■74025 / inTopicNo.5)  Re[3]: csvデータを読込んで、csvデータ書出
□投稿者/ WebSurfer (397回)-(2014/11/24(Mon) 02:03:42)
No74023 (takuya さん) に返信

> プラスがアンドになるのは理解しています。

そういう話ではないです。

> 本で勉強した際も、自動判別で足し算にするのか、文字を結合すると書いてあった記憶があります。
> その足し算か結合かを明示的に記述することはできないのでしょうか?

型を強く意識しましょう。

String とか Int32 とかが型ですが、それは何だか分かりますか? VB の勝手な方変換のお
かげで、そのあたりを意識しない人が VB のプログラマには多いのですが・・・

例えば、両方 String 型の "200" + "1000" と、両方 Int32 型の 200 + 1000 は結果が違う
のは分かりますか?

まずはそれが分かるまで勉強してください。
引用返信 編集キー/
■74026 / inTopicNo.6)  Re[3]: csvデータを読込んで、csvデータ書出
□投稿者/ 魔界の仮面弁士 (179回)-(2014/11/24(Mon) 02:46:46)
No74023 (takuya さん) に返信
> プラスがアンドになるのは理解しています。
> 本で勉強した際も、自動判別で足し算にするのか、文字を結合すると書いてあった記憶があります。
覚えている範囲で良いのですが、その本のタイトルは分かりますか?
(ご自身でお持ちの書籍であれば、できればページ番号も教えて頂けると…)


> その足し算か結合かを明示的に記述することはできないのでしょうか?
VB のヘルプに書かれてはいますが、それだと分かりにくいと思いますので解説を。

まず Visual Basic においては、+ は基本的に加算用のものです。
文字列連結として扱われるのは、両方が文字列型(文字型も含む)だった場合に限定されます。


(1) & 演算は、両方の型が何であれ「文字列連結」として処理されます。
 文字列型でないものも、文字列型への自動変換を行った上で結合されます。

(2) + 演算は、両方の型が文字列型であった場合のみ、「文字列連結」として処理されます。

(3) + 演算で、一方の型が数値型だった場合は、常に「加算演算」として処理されます。

ちなみに C# の場合、+ 演算は「一方が文字列型なら文字列連結」という
VB とは異なるルールとなっていますので、言語間移植する際にはご注意を。


今回の場合、2 のルールによって連結されていたことになります。
つまり「加算」したいのであれば、いずれか一方の型、もとい、両方の型を
数値型にしてから + してやれば良いということです。いわゆる型変換ですね。

今回、* 1 で対処されたようですが、それだと Double 型として
扱われることになりますし、あまり良い書き方ではありません。
(Option Strict On のモードだと、コンパイルエラーとして弾かれます)


対処方法はいろいろありますが、簡単な方法としては
 CInt(field(1)) + CInt(field(5))
のように書くことです。この場合、Integer 型の加算として扱われます。

ただしこれは、左値・右値・演算後の値の 3 値すべてが、Integer の範囲に
おさまるということが前提となります。範囲外の値の場合、型変換エラーとなります。

もしも Integer の範囲外の数字が相手なら、CLng で Long 型にするだとか、
整数ではなく小数を含む値なら、CDec で Decimal 型にするなど、
値に応じた変換を施す必要がありますので、そこは適宜調整してください。


さらに言えば、field(n)に非数字な文字列(たとえば空の文字列など)があり得るなら、
いきなり CInt や CDec 等で変換するのではなく、内容チェックも必要となるでしょう。

もしも値チェックも必要であるというのなら、Integer.TryParse メソッドや
Decimal.TryParse メソッドなどを用いることができます。これらのメソッドは、
数値への変換が行えるかどうかを調べる作業と、変換した結果を変数に格納する処理を
同時に行ってくれます。

あるいは、正規表現などを使って事前確認しておくという手法もありますね。
引用返信 編集キー/
■74027 / inTopicNo.7)  Re[2]: csvデータを読込んで、csvデータ書出
□投稿者/ takuya (6回)-(2014/11/24(Mon) 03:12:53)
ありがとうございます。
解決いたしました。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -