タイトルに関して結論から言っちゃうと「改行コードに気をつけて」で終わっちゃう話なんですが、
そんな凡ミスで延々と悩み続けてしまったので、備忘録としてきちんと書いときます。
※解決方法はLinux寄り(ShellScriptで解決する方法)で、最下部に書いてます。急いでいるかたはそちらをどうぞ。
したかったこと
(1) Linuxでカンマ区切りのCSVファイルを生成
↓
(2) PSCPでWindowsへファイル転送
↓
(3) 任意のExcelへCSVをインポート
...というのを、VBA(Excelマクロ)を使ってやりたかったわけです。
※(1) だけはLinuxのShellScriptでやってますが。
ハマった
やりたいことはすごく簡単なはずなのに、(3) のCSVインポートが下記エラーで引っかかる!
※やり方(コード)はググった結果を試しただけなので、ここでは割愛します。
(アプリケーション定義またはオブジェクト定義のエラーです。)
デバッグしてみると、どうやら最初の変数に格納されるデータ量が多すぎるように思えたので、
(2) で転送してきたCSVファイルを編集して行・列を減らしてみると、うまくいく… やっぱりデータ量?
もしかして...?
行・列をたった1行・1列減らしただけでうまくいくということは、データ量の問題ではない?
もしかして、Linux/Windowsの文字コードの違いが原因か!?
と思い、コード変換してからインポートしてみる。(ちなみにコードは下記のような感じ)
# iconv -f utf-8 -t sjis test.pl -o test.csv
...が、うまくいかない。状況変わらず。
あぁ、、そうか
(最初に結論を書いちゃってるので、読み物としては面白くないですが)
そうです、Linux/Windowsの改行コードの違いが原因でした...。
言われてみれば当たり前、誰でも知ってる(?)ことなんですが、
Linux(UNIX/Mac)環境では LF
Windows環境では CR+LF
これです、これを考慮しておかないとダメなんです。
違いは知ってました。知ってましたけど、なかなか気づけなかったんですよ…。
で、どうやって解決したか
VBA側で改行コードを変換(置換)するか、LFコードで改行したファイルを読み込む 方法もあるようですが、
VBAのコードを書き換えるのが面倒なので 簡潔に、Linux側で改行コードを変換する方法で対応しました。
# 変換前 ($はLF)
[user@testsv ~]$ cat -e test.csv
head1,head2,head3$
test1,test2,test3$
# 改行コード変換
[user@testsv ~]$ sed -i -e 's/$/\r/g' test.csv
# 変換後 (^M$がCR+LFです)
[user@testsv ~]$ cat -e test.csv
head1,head2,head3^M$
test1,test2,test3^M$
(1) のCSVファイルの生成Scriptに、sed ... の一行を加えるだけで解決!
めでたしめでたし。