お疲れモードなGW 明け、と、.csv な想い出(^^)? 改行マークな感じの突破方法?
--- 2020-05-09 ---
ちかれたビィ〜?
(=^^=)?
みぃ〜ミぃ〜、ニャぁ〜?
連休明けは、如何なご様子でしょうか?
(^^);
私ちゃんな鬼平は?
、、、鬼なので?
、、、普通に全力疾走です?
って、、、80% 位かな?
程々モードじゃないと疲れますので、週末とかはクタクタです
昨夜も恒例モードで、動画を見ながら寝落ちです
、、、自身の価値も値落ちです?
は、、、置いといて?
---
週末な土日の新下関周辺の天候は?
(^^)?
残念ながら? 雨っぽい?
(^^);
確定でしょうか?
今現在、9:30 頃ですが、風が強いですが、雨は降っておりませヌ!
雨雲レーダーですと、10:00過ぎには一旦、降り始めそうな感じ
その後は、レーダー的には一旦、雨雲が消えそうですが分かりません
継続的に発生し続ける? かも知れませんので!
概ね今日は、雨っぽい雨降りそうョ?
な、、、感じです
明日(日)も午前中までは雨っぽい?
その後も、断続的な雨かもですが、新下関的には雨は上がりそうな感じがします
(^^)?
恒例な? お洗濯? お済みでしょうか?
(@@);
今しか無いョ
と、、、思ってお洗濯はして置くのが良いかもネ
今だと室内干しでも、そこそこ乾燥モードなので除湿機さえ有れば普通に乾きそうな感じです
週末のお洗濯だけは絶対です ^^;
も、、、置いといて?
---
.csv の想い出話しでございます
ボチボチ書きます、何度もセーブするのでお許しを!
(=^^=)?
暇ニャンコ?
(^^);
そぉ〜かもネ
テキストファイル
内部なシステム的だと、チョット無理?
ってか、面倒くさい
って事だと改善して貰う事も可能です
(^^)?
これさぁ〜、出来ない事は無いかも知れないけど、このまま読み込むのって大変ョ?
嫌ぁ〜、でも仕様なので、これでヤって下さいな?
(^^);
じゃ、このファイル、どぉ〜ヤったら簡単に読めますか?
な、、、不毛な闘いが勃発です?
って、、、感じでしょ
大体、問題になるのは、可変の項目数と改行マークです
1) Windows
平たく言えば、
CR、キャリッジリターン、Chr(13)
LF、ラインフィード、Chr(10)
Chr は逆かも知れないので、調べて下さい
、、、覚えてないの?
(^^)?
、、、調べる事も勉強なのョ?
2) Unix
LF、改行マーク、1バイトでございます
3) 可変項目数
これは、ヘッダ、フッター、が付いてたりする感じ
タグで区切られたって感じのファイルも有りますが今回は置いときます
一般的な、.csv でのお話しです
ヘッダ部、処理した日付とか何チャラが入っています、レコード識別コードみたいなのが設定してたりします、概ね、1、か、0
データ部、普通に必要なデータが入っています、識別=2、1
フッタ部、データの件数などが入ってる事が多いです、識別=8、9
4) 文字コード
今回は置いときますが、Shift-JIS、Unix な感じでアレコレ有ります
(^^)?
最近の傾向は?
(^^);
UTF-8、これにしたい人が多い模様?
これも置いときますが、過去や現在のPC 環境を無視して選択すると大失敗するのでご注意下さい
これは以前もカキコしております
PC にも歴史が有って何故そうなのか? も、有りますので、グローバル標準だけを基準にしてたら飛んでも無い事態になりますョ
全部のシステム、PC 環境も含め、新規で出来るんだったら良いかもですが、、、?
???
鬼平的には??? で、ございます
で、方法論はアレコレです
人に依って、データ件数に依って、等など選択肢は幾つか有ります
(改行マークの突破方法)
テキストファイルの読み込み方法
INPUT #file-no, DATA(1), DATA(2)、項目単位のI/P
LINE INPUT #88, DATA、行単位のI/P
INPUT のファイル操作のアレを使う事も有りますが、割愛します
ファイルの終わりは、EOF(#88)=True、=True は省略可、Fase な時は Not EOF(#88)、EOF(#88)=Fase、=0 False、=-1 True 等同じです
踏まえ
1) Windows CRLF
LINE INPUT でも、INPUT でも問題ないと思います
好きにして!
カンマ編集ですから読み込んだ後に配列に入れたりします
行I/P --> 配列へ、LINE INPUT の場合
Dim Dat(10) As String、(0)〜
Dim Dat(1 To 10) As String、(1)〜、好きにして!
LINE INPUT #88, Dat(0)
For ix = 1 To 10
Dat(ix) = Split(Dat(0), ",")(ix - 1) 'スプリットは(0)〜です
Next
こんな感じかな?
INPUT #88, Dat(1), Dat(2), ... Dat(10)
こちらですと、文字列などで、"xxx" カンマが有っても良い様にダブルコーテーション " で括っても省略されて読み込めますので、私的には概ねコッチを利用します
改行マークも読み飛ばしてくれます
2) Unix LF
Dat(0) = INPUT(1, #88) '構文忘れた多分こんな感じ、1バイトを読み込みます
と、、、複合技です ^^?
Do Until EOF(88) 'Not か忘れた ^^; 調べてネ
INPUT #88, Dat(1), ...Dat(10)
Dat(0) = INPUT(1, #88) '改行LF 読み飛ばし
何かの処理
Loop
Dat(0) = ですが、F8 とか、Debug.Print とかで確認したいので(0) へ入れてるダケです、無くてもOK、その時は、INPUT(xxx) のカッコが不要と思います ^^; 調べてネ
概ねコレで突破は可能です
面倒なので、GET でALL でI/P --> 配列に入れる
は、、、止めましょう、メモリ食うしPC 動作も遅くなるし、メモリ環境など等にも依りますし、PC 自爆もあり得ますので! 他人のPC じゃ動かないって事です
★Debug.Print LF ですが、見れませんので、
IF Dat(1) = vbLF Then Debug.Print "LF", IP_CNT とか何チャラにして識別してます
(可変項目数の対処方法)
上記な感じも踏まえます、結局、応用なのです、考え方ネ
.csv のデータ
1, yymmdd, abc
2, a1, b1, c1, d1, e1
2, a2, b2, c2, d2, e2
8, 2 '2=データが2件の意味とします
Dim IP_CNT As Long
INPUT #88, Dat(1), Dat(2), Dat(3) 'ヘッダ読み飛ばし
Do Until EOF(88)
Dat(0) = INPUT(1, #88) 'Unix LF の場合読み飛ばし
INPUT #88, Dat(1), Dat(2) 'フッタ8 に合わせています
If Dat(1) = 8 Then Exit Do 'Loop から抜ける
INPUT #88, Dat(3),...Dat(6) 'データ2 残りの項目をI/P
IP_CNT = IP_CNT + 1 'データ件数
何チャラ処理
Loop
If Dat(1) = 8 Then
If Dat(2) <> IP-CNT Then
メッセージBox とかで、件数違うョ!
End If
End If
件数チェックとかは省略しても良いかも知れません
上手く行かなければ、変なデータ、文字列にカンマ編集とか、で読み込めないでしょうからネ、そんな時は又、チト工夫が必要ですが!
概ねコレでイケるハズ!
★一見すると、人はINPUT 自体で1行分を読み込まないとイケ無い錯覚に陥ります
1行分を2回など複数回I/P しても良いのです
で、、、ヤって見る
OK だったら、それで良いのです
これがms 流で、簡単に諦めない、の秘訣かな?
(その他)
処理前にエクセルに変換させる
これは、レポート作成などを参考にして貰えれば出来ると思いますし、マクロの記録でも確認できると思います
テキストインポート操作をしてマクロを記録
エクセルで、別名で保存すれば 、読み込み可能な固定項目数、改行マークになると思われます
処理は別々に行った方が良いと思います
1度しか行わない変換をインポート時に何度もヤるのは効率が良くないですし、テストの時に毎回時間がかかる掛かるので!
正しく処理されれば、1変換、1インポートですが、不具合が有って調べる時は面倒だからです
インポート後は、変換後のエクセル保存の.csv を削除するか残すかは適宜で考えましょう
アクセスVBA だったら、Access 自体のインポート、エクスポートでも良いかも知れませんが、以前カキコしましたAccess のインポート出来ない、何でだろ? が、有りますので、エクセルで開き、別名で保存、手作業でも良いかもネ
、、、的なアレコレです
って、、、感じの?
(^^)?
.csv な想い出話しでござんした?
(^^);
想い出は?
、、、大切なのョ?
と、、、毎回言っておりますが、ms なりに使う事、と、簡単に諦め無い、けど、無理っぽかったら別の手を考える!
が、、、重要かもネ
---
そぉ〜言えば?
(^^)?
Excel2019 だけかは不明ですが?
毎回、別のエクセルが最小化から復帰表示され、同じ位置に開くエクセルが起動されます
(^^);
以前は、適当な位置に段々になって重ねられたり、単独表示だったんですけどネ
、、、何でだろ?
、、、凄く、鬱陶しいです?
、、、ってか、見辛いです?
、、、ってか、開きたいファイルが識別し辛い?
そうそう、Office2013〜、アプリっぽくなりました
何となくな感じですが?
.net が、Office を制御してるっぽい気がします
(^^)?
.net が、Office2010 のインストール版を操作してます?
って言った方が分かり易いですかネ?
(^^);
、、、何となくですが、そんな気が致します
タスクマネージャを見たり
エクセル帳票を作ったりしてますが、エクセル自体が遅くなった? 重くなった?
、、、そんな気がするのです
.csv 含め?
ご利用は、計画的に!
、、、で、ございます
---
丁度、お昼時になりました
雨、降ってます
風、南っぽい強風的です
(^^)?
夜ご飯は、どぉ〜しよう?
(^^);
な、、、久々に、ゆっくりモードな週末です
チョコ、お菓子?
、、、最近、チョコパン模様です
、、、チョコちょこ買ってます
(@@)?
落ちニャンコ?
(=^^=);
、、、そぉ〜かもネ
--- 2020-05-24 ---
思い出したので追記します
、、、.csv 突破な想い出話し?
1) 項目が "abc", "123" LF なパターン
ダブルで括られてる場合です
これは、上記で2) 1バイトを読み飛ばせばイケるはず!
2) 項目が括られていない、良く有るパターン
この場合は応用編です
全ての項目をクルクル回して、取得項目を成形したり、全部取得で , でSPLIT 配列にしたり、人それぞれです
この場合、前回もカキコしましたが、メモリ喰ったり、クルクル時間が掛かります
(^^)?
どぉ〜するの?
(^^);
最後の項目だけをクルクルします
サブでもファンクションでも良いですが、指定の文字までクルクルを作ります
例)
Private Sub X_KURUKURU_IP(P_DAT As String, Optional P_LF As String = vbLf)
Dim iDAT As String
P_DAT = ""
Do
P_DAT = P_DAT & iDAT
iDAT = INPUT(1, #88)
Loop Until iDAT = P_LF
End Sub
処理側メイン
INPUT #88, 項目a, 項目b, 項目c
Call X_KURUKURU_IP(項目z)
こんな感じでループさせます
最後の項目だけなので、クルクル時間は最小限に出来ます
適当に書いてますので、細かい所は調整して下さい
、、、考え方だけ! 書いております
結局の所、ダブルで括ってくれさえすれば、一番簡単なんですけどネ
後は、エクセルで開き直して、I/P させるのが楽チンかもです
又、思い出したら追記します
でも、大体の応用は、コレでイケるハズです
---
明日見村
村長さんでした
(^^)/ .csv CRLF