どうも、はむばねです。
はい、今日も今日とて改善活動という名のVB遊びで業務の自動化とかは進めてたわけなんですけどね。
詰んだので、誰か私に教えてたもれ!
やりたいのは、Excelシートのデータを使ってUNIXのシェルスクリプトを自動生成すること。
文字コードはUTF-8です。
で、文字コードの問題まではいいんだ。
ADODBを使って、以下のようにさっくり実装。
'========================================================'
'オブジェクトをセット
Set TS = CreateObject("ADODB.Stream")
'オブジェクトの文字コードと改行コード(LF)を指定する。タイプはテキスト
TS.Type = 2
TS.Charset = "UTF-8"
TS.LineSeparator = 10
'オープン
TS.Open
'先頭におまじないを書き込み(改行を含む)
TS.WriteText "#!/usr/bin/ksh", 1
'Sheet2のラストの行まで処理
k = 1
Do Until k > DestRLast
' A列の内容をレコードにセット
strREC = Cells(k, 1).Value
' レコードを書き込み(改行を含む)
TS.WriteText strREC, 1
k = k + 1
Loop
'ファイルに出力(上書き保存)
TS.SaveToFile strFILENAME, 2
'========================================================'
ただ、これで生成したシェルを実行しようとすると先頭の行で怒られるんですよね。
ただのおまじないになんやねん、と思ったらどうやら先頭に何か変なもんが挿入されてる様子。
調べてみると、ファッキンなことにBOMが先頭に(3バイト)追加されるとのこと。
なので、一旦バイナリに変換して、3バイト進めた上で読み込み直すという、クソめんどい処理を追加したわけですよ。
'========================================================'
'前述ループ処理の後に以下を追加
' Positionを一度0に戻し、バイナリモードに変更
TS.Position = 0
TS.Type = 1
' Positionを3にしてから読み込むことで最初の3バイト(BOM)をスキップする
TS.Position = 3
' バイナリデータを一旦保存
bytData = TS.Read
'TSを開きなおし、保存しといたバイナリデータをコピー
TS.Close
TS.Open
TS.Type = 1
TS.Write bytData
'ファイルに出力(上書き保存)
TS.SaveToFile strFILENAME, 2
'========================================================'
ネット上では、これで解決することになってるんですけどね。
ただね、実際にこれをやってみると文字コードがSJISに戻ってたんだ。
振り出しに戻っとるやないかwwww
なんなの? 環境の問題なの?
もしくはどっかで勘違いしてるの?
いやまぁでも改行記号はLFのまま残ってるし、日本語使うわけでもないのでシェルスクリプトを生成するって意味では実用段階にはなってるんですけどね。
別段、公の場に出す代物でもないですし。
ただ、なんとなく気持ち悪いよね。
というわけで、教えて詳しい人!
ちなみに、話題的には情報系ですが問題が解決してないので今回は普通のテーマ。
問題が解決したら、解説付きでまとめるかもしれない。
はい、今日も今日とて改善活動
詰んだので、誰か私に教えてたもれ!
やりたいのは、Excelシートのデータを使ってUNIXのシェルスクリプトを自動生成すること。
文字コードはUTF-8です。
で、文字コードの問題まではいいんだ。
ADODBを使って、以下のようにさっくり実装。
'========================================================'
'オブジェクトをセット
Set TS = CreateObject("ADODB.Stream")
'オブジェクトの文字コードと改行コード(LF)を指定する。タイプはテキスト
TS.Type = 2
TS.Charset = "UTF-8"
TS.LineSeparator = 10
'オープン
TS.Open
'先頭におまじないを書き込み(改行を含む)
TS.WriteText "#!/usr/bin/ksh", 1
'Sheet2のラストの行まで処理
k = 1
Do Until k > DestRLast
' A列の内容をレコードにセット
strREC = Cells(k, 1).Value
' レコードを書き込み(改行を含む)
TS.WriteText strREC, 1
k = k + 1
Loop
'ファイルに出力(上書き保存)
TS.SaveToFile strFILENAME, 2
'========================================================'
ただ、これで生成したシェルを実行しようとすると先頭の行で怒られるんですよね。
ただのおまじないになんやねん、と思ったらどうやら先頭に何か変なもんが挿入されてる様子。
調べてみると、ファッキンなことにBOMが先頭に(3バイト)追加されるとのこと。
なので、一旦バイナリに変換して、3バイト進めた上で読み込み直すという、クソめんどい処理を追加したわけですよ。
'========================================================'
'前述ループ処理の後に以下を追加
' Positionを一度0に戻し、バイナリモードに変更
TS.Position = 0
TS.Type = 1
' Positionを3にしてから読み込むことで最初の3バイト(BOM)をスキップする
TS.Position = 3
' バイナリデータを一旦保存
bytData = TS.Read
'TSを開きなおし、保存しといたバイナリデータをコピー
TS.Close
TS.Open
TS.Type = 1
TS.Write bytData
'ファイルに出力(上書き保存)
TS.SaveToFile strFILENAME, 2
'========================================================'
ネット上では、これで解決することになってるんですけどね。
ただね、実際にこれをやってみると文字コードがSJISに戻ってたんだ。
振り出しに戻っとるやないかwwww
なんなの? 環境の問題なの?
もしくはどっかで勘違いしてるの?
いやまぁでも改行記号はLFのまま残ってるし、日本語使うわけでもないのでシェルスクリプトを生成するって意味では実用段階にはなってるんですけどね。
別段、公の場に出す代物でもないですし。
ただ、なんとなく気持ち悪いよね。
というわけで、教えて詳しい人!
ちなみに、話題的には情報系ですが問題が解決してないので今回は普通のテーマ。
問題が解決したら、解説付きでまとめるかもしれない。