あるCSVデータを VBで読み込んで変数に格納してましたところ、
奇妙なことが起こりました。
最初のデータは
""1234567"" で 次のデータは "1234" なのです。
最初の変数はLongが望ましいので、 CLngで変換してもエラーが発生します。そのままStringの変数に入れると「"1234567"」になってしまいます。
いろいろ駆使して、やってみましたが、どーーも最初の文字だけダブルコーテーションなのです。
Clngではなくてどのようにすればいいのでしょうか?
>""1234567"" で 次のデータは "1234" なのです。
これは実際のデータ(CSVファイル)の中身がそうなっているでなければ、
変数に格納する時に、そうゆう処理してませんか?
という解答しかできないと思いますが・・・。
CSVファイルの中身をテキストファイルで開くとどうなっていますか?
Clngをする前にReplaceでダブルクォーツを取り外すのではどうでしょ?
>Clngをする前にReplaceでダブルクォーツを取り外すのではどうでしょ?
全てのデータがLongならばそうゆうこともできるけれども、
CSVデータとしてダブルクオートが入る場合もあるので、あまりやりたくないなぁ〜。
それより質問者は、
ささき さんが言うように、
ファイルを読込む前の状態にそういったデータが含まれるのか
それとも、
データにはダブルクオートが含まれていないのに格納される変数にだけ
なぜかダブルクオートが含まれるのか?
の解答をしたほうが有力情報だと思うけれど・・・。
>Clngではなくてどのようにすればいいのでしょうか?
を簡単に行う場合がReplaceです・・・
根本を解決するのであればささき氏・お勧めしない氏両名が言うように
CSVファイルの中身を確認し、
「"1234567",1234」であれば、CSVファイルが問題
「1234567,1234」であれば、読込み時に何かあると考えるべきだと思います。
読み込む時に単純にStreamReaderで読み込んでいるのか、
会社であれば独自のフォーマット変更ファンクションとか通していませんか?
CSVって
・区切りはカンマである。
・データにカンマを含む場合はダブルクオートで囲う。
・ダブルクオートで囲ったデータ中のダブルクオートはダブルクオート2回で置き換える。
CSVのデータの中身ひょっとして、
"1234567,1234"
とかなっていない?
わかりづらいので
初 サンの記述で投稿
「"1234567,1234"」
とかなっていない?
エディタで開くと
"売上ID","配送先ID"←(CRLFではない)
"1234567","1234"・・・
NOTEPADだと改行入ってないので
"売上ID","配送先ID","1234567","1234"・・・
このCSVデータはあるWebショップ受注のダウンロードデータです。
頭に""となってないので、
>「"1234567,1234"」
ってわけではなさそうなのですが、
VBで
'■テキストファイルをオープン
Open FileName For Input As #intFileNo
'■ファイルの終端までループを繰り返します。
Do While Not EOF(intFileNo)
'■1 行づつ変数に読み込みます。
Input #intFileN str売上ID, str配送先ID,・・・
ってやると ツールチップにどーやら ""1234567" ってなってるっぽいです。
このInputの方法が悪いのかなと。。。
もーちょっとやってみまして、また質問が出てくるかもしれません。
その時はよろしくお願いします。
別プログラムでCSVを吐き出し
mori氏のプログラムで読込む場合
別プログラムが
strWord = """""1234567"""",1234"
とかを吐いてる可能性も?
>"売上ID","配送先ID"←(CRLFではない)
>"1234567","1234"・・・
>
>NOTEPADだと改行入ってないので
>"売上ID","配送先ID","1234567","1234"・・・
NotePadで開いた時に
"売上ID","配送先ID""1234567","1234"・・・
↑このようにならないんですか?
配達先IDと3つ目の値が1つの文字列とみなされてませんか?
> "売上ID","配送先ID"←(CRLFではない)
> "1234567","1234"・・・
のデータは、mori氏が想定しているCSVの形式であれば問題ないけれど
スルーしているので、きっと問題は無いのでしょう。
何個か追加で質問
・"1234567","1234"・・・の後の改行コードは(CRLF?)
・また複数件のデータの時は
"売上ID","配送先ID"←(CRLFではない)
"1234567","1234"・・・
"売上ID","配送先ID"←(CRLFではない)
"1234567","5678"・・・
っと、売上IDや配送先IDの列も1件に対し、1件入っているイメージ?
それとも最初だけ?
"売上ID","配送先ID"←(CRLFではない)
"1234567","1234"・・・
"1234567","5678"・・・
>配達先IDと3つ目の値が1つの文字列とみなされてませんか?
Inputされた値の分解で、
ヘッダ行("売上ID","配送先ID"・・・)と
データ行("1234567","1234"・・・)を
うまく切り離されていないのではないかな?
>"売上ID","配送先ID"←(CRLFではない)
の改行コードがわかれば・・・。
>"売上ID","配送先ID""1234567","1234"・・・
↑このようにならないんですか?
すみません、なりました。
CRLFではなく「0a」だということがわかりました。
>それとも最初だけ?
最初だけ 売上IDとかヘッダがつきます。
えっと、、、
この場合 どのようにして読むのが一番いいのでしょうか?
バイナリーで読むのでしょうか?
ちょっとやってみます。。。
できました。
Replace!使えましたっ!
バイナリで読み込まなくてもよさそうです。
ありがとうございました。
解決おめでとうございます。
個人的に最善と思うのは上位の排出ロジックを変更してもらい、
"売上ID","配送先ID"(CRLF)
"1234567","1234"(CRLF)
"2345678","1234"(CRLF)
・・・
と排出してもらう。
読込みループ中に
Dim intNum As Integer ←変数名適当
intNum = 0
Do While Not・・・
If intNum = 0 Then
ヘッダー変数代入
Else
データ行代入
End If
intNum = intNum + 1
Loop
変数代入の時にString→Long変換ファンクションを作成し、
ファンクションの中でエラーや変換に不要なものを整理する
(Replaceや数値チェック)
が、個人的にお勧め。
この辺りは十人十色。
ツイート | ![]() |