過去の桐井戸端BBS (桐ver.8)
14020 ファイル変換:固定長でテキストファイルの行頭の空白が無視されてしまう 幅田 2001/11/18-00:08
皆さん、こんにちは。
久しぶりに一括処理を手がけています。
以前に作った一括処理(桐v8sp6)を改良しているところです。

””(ダブルクォーテーション)を含んだテキストファイルを
表のデータとして取り込みをしたいので、通常の「読み込み テキスト」
コマンドは使えず、過去ログ↓にもあるように

http://www.fuku3.com/~habata/kbbs/kakov8/10181.htm

「ファイル変換 固定長」コマンドを使って、表データに変換しています。


ファイル変換 固定長,&パラ,"読込.tbl",表番号=3,改行コード=あり,自動設定=しない,終了状態=&OK,{[読込]文字列/2000}

(&パラはテキストファイル名)

しかし、テキストファイルの行頭にスペース(空白)があった場合、その空白は無視されてしまいます。
なんとか、テキストファイルの行頭に空白があってもそのまま読み込みたいのですが、
どうしようもないことなのでしょうか?

今はしかたなく、「読み込み テキスト」を使って読み込んでいます。
その場合、↑の過去ログにもあるように、行頭に””で囲まれた文字があった場合
それ以降は無視されるので、手作業で修正を加えています。

それも納得がいかないので、やはり「ファイル変換 固定長」を使いたいのですが。
14021 Re:ファイル変換:固定長でテキストファイルの行頭の空白が無視されてしまう 【多遊】 2001/11/18-00:34
記事番号14020へのコメント
幅田さんこんばんは>
#10181のような例でしたら、テキスト読み込みで読めると思いますが
支障のない部分(または例)を、2〜3行ご紹介いただけませんか?

ちなみに上記(#10181の数字・氏名の入ってるサンプル)は、拡張子をtxtにして、
テキスト読み込みで可能でした。

質問を勘違いしてるかもしれませんがよろしくお願いいたします。

14022 Re:ファイル変換:固定長でテキストファイルの行頭の空白が無視されてしまう 【多遊】 2001/11/18-00:54
記事番号14021へのコメント
ちなみに上記テキスト読み込みは

読み込み テキスト,"テキスト例題.txt",区切り=",",空白削除=しない・・・・
で、行いました。
14023 Re:ファイル変換:固定長でテキストファイルの行頭の空白が無視されてしまう 【多遊】 2001/11/18-01:11
記事番号14022へのコメント
やはり勘違い。
>ない,終了状態=&OK,{[読込]文字列/2000}

[読込]の1項目ですね。すみません無理でした。

かくなる上は一括で、複数項目に読み込み

項目置換[読込]=[読込]+[damyA]
項目置換[読込]=[読込]+[damyB]
項目置換[読込]=[読込]+[damyC]
項目置換[読込]=[読込]+[damyD]
・・・

途中文字制限にかかるようでしたら、
項目置換[読込]=[読込]+[damyA]
項目置換[damyA]=#u
項目置換[読込]=[読込]+[damyB]
項目置換[damyB]=#u
項目置換[読込]=[読込]+[damyC]
項目置換[damyC]=#u
項目置換[読込]=[読込]+[damyD]
項目置換[damyD]=#u
・・・

そんな感じでしょうか?


14024 Re:ファイル変換:固定長でテキストファイルの行頭の空白が無視されてしまう 幅田 2001/11/18-07:42
記事番号14023へのコメント
【多遊】さん
いつもお世話になっております。

>かくなる上は一括で、複数項目に読み込み

>項目置換[読込]=[読込]+[damyA]
>項目置換[読込]=[読込]+[damyB]
>・・・
>
>そんな感じでしょうか?

項目置換ではなくて、置換コマンドでいいんですね。
いい案をいただいたので、早速やってみましたが、
私の意とは違っていました。

どんなデータかとは書かなかったのですが、
普通の文章が入力されたテキストファイルを桐の表に読み込みたいのです。
中には、インデント(字下げ)されたものもあります。
字下げされたものは行頭に空白文字が入った形になっています。

普通の文章ですから、中には,(カンマ)や”(ダブルコーテーション)が入ったものもあります。
それをそのままの形で桐に読み込みたいのです。

No.10181の例でしたら
↓ですが、
例1)123456,123456,123456,123456,123456,123456
例2)"佐田 守弘","悲しげ","Ogo","hidetake","【多遊】","幅田 浩司"
例3)98765,"佐田 守弘","悲しげ","Ogo","hidetake","【多遊】","幅田 浩
司"

そのほかに
例4)     123456,123456
例5)     "佐田 守弘","悲しげ","Ogo"
例6)     98765、"佐田 守弘","悲しげ"

というようなものも、頭に空白が入ったままの状態で読み込みたいのです。

上記の例では、普通の文章ではありませんが、文章の中に上記の例みたいな部分もあります。
通常の文章でしたら、なんら問題はないのですが、上記の例の部分にさしかかるとたいへんやっかいなのです。

14025 Re:ファイル変換:固定長でテキストファイルの行頭の空白が無視されてしまう 【多遊】 2001/11/18-08:35
記事番号14024へのコメント
幅田さん。おはようございます。

昨日はやっぱり勘違いでしたね。どうもすみませんでした。
ところで、エディタの使用は可能でしょうか?

エディタで、ctrl+A(すべて選択),ctrl+C(コピー)を行い
桐表で、編集→形式を指定して貼り付け(テキスト)を行うと
,や”はもちろん、先頭の空白まできれいに行くようです。
そのあとの、半角スペースの処理はまだ残ってますが。

ただ、1・2回程度でしたら、これで済みますが、毎日の業務とかでしたら、
やはり、一括に組み込まないと大変ですね。

私も、皆さんからのお答えを待ってみます。

14026 Re:ファイル変換:固定長でテキストファイルの行頭の空白が無視されてしまう 幅田 2001/11/18-08:45
記事番号14025へのコメント
【多遊】さん
ご心配ありがとうございます。

>昨日はやっぱり勘違いでしたね。どうもすみませんでした。
>ところで、エディタの使用は可能でしょうか?

エディタでひとつひとつコピーするというのはできません。

二千個以上のテキストファイルになった文章を一気に桐の表ファイルに取り込みたいと考えています。
ただ、先頭に ” があるファイルも数が限られていますので、読み込みコマンドを使用して、
一気に読み込んだ後、”が含まれる文章を絞り込んで
そのデータだけを修正するというのが、今のところの策です。

限られているといっても少なくとも百個以上あるので、
なるべく手作業をなくすことはできないかと思っている次第です。


14028 Re:全く別の発想ですけど pokopon 2001/11/18-09:59
記事番号14024へのコメント
幅田さん こんにちは
いつもお世話になっています。

この問題については、私は今までの経験がないため、最初???でしたが、
検証してみると、確かに・・・・。
意外と「当たり前」のことが「桐」ではできないようです。
余計な処理をして欲しくない(先頭の空白を無視するなど)ですね。 (^^ゞ

>というようなものも、頭に空白が入ったままの状態で読み込みたいのです。

ということで、桐様のご機嫌を損なう原因は「先頭が空白」な訳ですので、読み込むファイルの行頭に別の文字列を付加し、
それから処理する、すなわち、テキストファイルの「下ごしらえ」が必要かと思われます。

しかし、桐様でさえ、まともにそのまま読めないのですから、データの加工は、やはり外部のスクリプトに頼るしかないでしょう。
エディタで処理しても結構ですけど。 (^^ゞ 地道な作業ですね。

「1行まるまる読み込んで」→「先頭に適当な文字列を追加して保存」と言う処理のためのスクリプトを紹介します。

'------------- ファイル変換スクリプト(WSH) -------------
Const ForReading = 1,ForWriting = 2,ForAppending = 8 '定数の指定
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")

sFile = "read.txt" #タ' 読み込みテキストファイル
sWord = "<>" #タ#タ' 先頭付加文字
rFile = "result.txt"#タ'結果書き込みファイル

Set oTs1 = Fs.OpenTextFile(sFile,ForReading) #タ'ファイルを読み取りモードで開く
Set oTs2 = Fs.CreateTextFile(rFile,True) #タ'ファイルを作成する

Do Until oTs1.AtEndOfStream #タ#タ'oTs1を末端まで読み込むまでループを繰り返す
sLine = oTs1.ReadLine #タ#タ#タ'1行読み込む
oTs2.Write sWord & sLine & vbCrLf #タ'先頭に文字を付加して書き込む
Loop

oTs1.Close 'oTs1を閉じる
oTs2.Close 'oTs2を閉じる

MsgBox "変換結果を " & rFile & " に出力しました。"

'----------- END ---------------

上記の部分を、エディタに貼り付け、拡張子に[.vbs]をつけ、適当なファイル名で( 例えば henkan.vbs )として保存して下さい。

環境に合わせて変更するのは、
sFile = "read.txt" #タ' 読み込みテキストファイル
sWord = "<>" #タ#タ' 先頭付加文字
rFile = "result.txt"#タ'結果書き込みファイル
だけです。先頭付加文字は、上記の場合には <> としています。
読み込みファイル、書き出しファイルは、適当にその都度書き換えればよいでしょう。

実行は、Explorerから、このVBSのアイコンをクリックするだけです。

変換後、桐で読みこみ、先頭の2文字を#Uとすれば、めでたし、めでたし???

桐を使った処理ではありませんが、目的は達成されるかと・・・・・。

14029 Re:ここの掲示板も、先頭空白文字が・・・・ pokopon 2001/11/18-10:03
記事番号14028へのコメント

げげっ、ここの掲示板、先頭に空白があれば削除されるんですね。
(知らなかった!! というよりは、 今まで気が付かなかった?)

スクリプト、字下げしたつもりでしたが、全て左寄せです。
(LOGの容量節減のため、仕方ありませんですね)

ただ、それだけです。 m(__)m


14033 ファイル入力コマンドを使ってみては 佐田 守弘 2001/11/18-11:11
記事番号14024へのコメント
幅田さん
私は「ファイル変換 固定長」コマンドを使った事が少ないので、誤っているかも知れませんが、
固定長ファイルでは、フィールド間にあるスペースは、元来、データとしては不要なものですから、
自動で取り除く処理がされるのではないかと思います。

さて、幅田さんの目的は、一般的な文書テキスト(たとえば一太郎V3の文書テキスト)などを
桐の表に取り込みたいのだと解釈します。
私でしたらこの種の処理には、「ファイル入力 行」コマンドを使います。
このコマンドは、CR/LF(改行復帰)を区切りとして、1行単位で記述されている文字列を
そのまま読み込み先の変数に取り込めます。
ダブルクォーテーション、カンマなども含めて、全ての文字列をそのまま取り込めるはずです。

変数に取り込んだ後の処置については、そのデータをどの様に利用するかにもよりますが、
2通りの方法が考えられます。

@1行を1レコードとする方法
文書の1行を桐の表の1レコードとする方法です。
一般に、1行が4,000文字を超える事はまずないでしょうから、この方法であれば、確実に表に取り込めるはずです。
その代わり、1文書が多数のレコードに記録されます。
ですから、文書ごとに別の表にする(この方法は余りお薦めではない)か、文書名の項目と、
行番号の項目を作り、同一文書を絞り込んで表示するなり印刷する事になります。
印刷の場合には、小松先生流の可変長で位置を固定しないレポートが有効です。

A1レコードに複数行を取り込む方法
私はもっぱらこの方法を使います。読み込んだ文書テキストの1行ずつを、強制改行文字を挟んで
つなぎ合わせ、桐の表の上では1レコードとして扱います。
しかし、中には4,000文字を超える場合もあり得るので、この場合には適当な所で分けて、
複数行とします。その扱いは、上記と同じです。
どこで区切るかは、表示するフォームで表示できる文字数を目安にすると良いでしょう。
この方法は、文書の複数行をフォームの1画面に簡単に表示できる点です。

佐田守弘(KS-00119)
14035 Re:ここの掲示板も、先頭空白文字が・・・・ 【多遊】 2001/11/18-11:28
記事番号14029へのコメント
pokoponさん>こんにちは。

>げげっ、ここの掲示板、先頭に空白があれば削除されるんですね。
>(知らなかった!! というよりは、 今まで気が付かなかった?)
>スクリプト、字下げしたつもりでしたが、全て左寄せです。
>(LOGの容量節減のため、仕方ありませんですね)

ブラウザで表示すると半角連続は、前詰めされるようですが、
ソースには半角3個入ってます。(全角の場合は問題ないでしょう。)

ところで、

>「1行まるまる読み込んで」→「先頭に適当な文字列を追加して保存」と
>言う処理のためのスクリプトを紹介します。

>'------------- ファイル変換スクリプト(WSH) -------------
以下省略・・・
>'----------- END ---------------

いいですね。私の所でも紹介させてくださいね。

パソコンの中を「*.vbs」で、検索しましたらいくつか入ってましたが
いつ、またどのアプリが使うかは知りませんでした。
こうして、何かの時に単独で使用するのですか?
何か桐から話が遠のきそうで、恐縮です


14039 Re:ファイル入力コマンドを使ってみては pokopon 2001/11/18-14:18
記事番号14033へのコメント
佐田 守弘さん こんにちは

>私でしたらこの種の処理には、「ファイル入力 行」コマンドを使います。
>このコマンドは、CR/LF(改行復帰)を区切りとして、1行右端いで記述されている文字列を
>そのまま読み込み先の変数に取り込めます。
>ダブルクォーテーション、カンマなども含めて、全ての文字列をそのまま取り込めるはずです。

印字コマンドの逆パターンですね。なるほど。一気に表へ読み込もうとするから無理なのですね。
1行ずつテキストを読み込み(ループさせ)、桐の表ファイルへ「行挿入」していけば、
多分、幅田さんの目的にかなうと思います。
これなら、「桐」だけで解決します。

またまた、勉強になりました。 m(__)m


14040 Re:ここの掲示板も、先頭空白文字が・・・・ Ogo 2001/11/18-15:12
記事番号14035へのコメント

>パソコンの中を「*.vbs」で、検索しましたらいくつか入ってましたが
>いつ、またどのアプリが使うかは知りませんでした。
>こうして、何かの時に単独で使用するのですか?

VBS は Visual Basic Script で、 Windows Scripting Hostに関連づけされているでしょう。
基本的に MS-DOS のバッチファイルの代替だと思えば当たらずと言えど遠からずです。

ただし、これは Win 98 以降はプリインストールされていますが、
それ以前は意図的にインストールするか、
MS-IE の最新版への全面移行を行なっていない限りは入っていません。

この WSH というソフト(*.VBS)はセキュリティ上で
度々問題になっていて(MS-IE や OUTLOOK, EXPRESS
ではそのスクリプトを勝手に実行されてしまうので、
本人が意図せずにコンピューターの中身を改変されたり、
クラッキングを手伝わされたりする)、修正版も度々出ています。

私の場合、インストールはされている( MS-IE と共に最新の修正版に置き換えてはいる)が、
拡張子の関連づけでは「開く」を外して「編集」にしています。

どうしても(意図して)「*.VBS」を実行する時は、
そのファイルを右クリックした時に出るメニューから
「開く」を選びます。

14041 私も「ファイル入力」コマンドをお奨め 悲しげ 2001/11/18-15:15
記事番号14033へのコメント
出遅れましたが、佐田さんの仰るやり方でよいと思います。

過去ログ
http://www.fuku3.com/~habata/kbbs/kakov8/10181.htm
の中の#10181で私は次のように書いています。

>▼しょうがないので、暫定的に「ファイル入力」コマンドを使ってみました。
>これだとそのまま(ダブルクォーティションすら含んだまま)に取り入れが可能
>のようです。(ただ、ダブルコテションを残したままだと後でまた面倒に出くわ
>しそうですから、取り込んだ時点で文字置換で消しておきますが)
>と云う訳で、暫定的にこのように扱っていますが、

つまり、私はダブルクォーティション等を消したかった訳ですが、
今回の幅田さんの場合は逆に、これも残したいと云うことですから、
「ファイル入力」コマンドを使った方法でモロにお望みの結果となりそうです。
下記データに限ってですが、後段のような一括処理で試してみたところ、
行頭のスペース含めて、ばっちりそのまんまを取得できたようです。(^^)v
---------------------------------------------
例1)123456,123456,123456,123456,123456,123456
例2)"佐田 守弘","悲しげ","Ogo","hidetake","【多遊】","幅田 浩司"
例3)98765,"佐田 守弘","悲しげ","Ogo","hidetake","【多遊】","幅田 浩司"
例4)     123456,123456
例5)     "佐田 守弘","悲しげ","Ogo"
例6)     98765、"佐田 守弘","悲しげ"
---------------------------------------------
表 "ファイル入力test.tbl"  /*[読込]なる項目あり*/
cond(.not #空ファイル) 行削除 *,圧縮
ファイル入力開始 "ファイル入力test.txt",終了状態=&実行リターン
 繰り返し
  ファイル入力 &STR,行,終了状態=&実行リターン
  cond(&実行リターン=-1) 繰り返し中止
  行追加 [読込]=&STR
 繰り返し終了
ファイル入力終了
表形式編集 ガイド="結果を確認して下さい。"
---------------------------------------------

ちなみに、表において何らかの加工をした上で再度テキストに
「書き出し」した時の結果は、特に問題なく「そのまんま」であるようです。

14042 補足:読み込むファイルの一覧 佐田 守弘 2001/11/18-15:24
記事番号14033へのコメント
補足です。
読み込み対象ファイルが数千ある様ですので、これをいちいち指定していたらたまりません。
幅田さんには余計な話になるかも知れませんが、次の様にして、MS-DOSレベルでファイルリストを作成し、
これを読み込んで、読み込み対象ファイルのリストを作ります。
〔バッチまたはMS-DOSのコマンド〕
dir *.jxw /b /s > jxw.txt

この後は、[ファイル]の項目1だけの表「jxw.tbl」を作っておき、ここに上記で作成した
テキストファイルを読み込みます。
次いで、

表 jxw,表番号=1
読み込み テキスト,"jxw",{[ファイル]}
表 文書,表番号=2
編集表 1
繰り返し (.not #終端行)
 代入 &ファイル=[ファイル]
 編集表 2
 行追加 [ファイル]=&ファイル
 ジャンプ 行番号=最終
 代入 &実行リターン=1
 繰り返し (&実行リターン=1)
  ファイル入力 &文書,行,終了状態=&実行リターン
  行訂正 [文書]=[文書]+"<表に設定してある強制改行文字>"
 繰り返し終了
 編集表 1
 ジャンプ 行番号=+1
繰り返し終了

このままでは動きませんが、概ね上記のような一括処理で一気に読めるはずです。
なお、上記は、1文書を1レコードにまとめる方法ですが、4000文字を超える時の処理は含んでおりません。

佐田守弘(KS-00119)

14045 Re:補足:読み込むファイルの一覧 悲しげ 2001/11/18-16:09
記事番号14042へのコメント
桐のみで完結したければ
------------------------------------------
表 "jxw.tbl"  /*ところで.jxwって何でしたっけ?*/
cond(.not #空ファイル) 行削除 *,圧縮
&i=1
繰り返し
 &ファイル=#ファイル検索("*.jxw",&i)
 *お好みで、&ファイル=#ファイル名(#ファイル検索("*.jxw",&i),3)
 cond(&ファイル="") 繰り返し中止
 行追加 [ファイル]=&ファイル
 &i=&i+1
繰り返し中止
終了 表 編集対象表
------------------------------------------
のようにするやり方もあります。(^^)

それと挙げられた一括処理では「ファイル入力開始」「〃終了」コマンドが有りませんがそれはさておき(^^;)、
また、幅田さんのやろうとしていることは、おそらくは強制改行文字を挟んで連結するつもりは
無いように想像していますがそれもさておき。
4000文字超対策の一例です。
------------------------------------------
・・・・・・・・
繰り返し (&実行リターン=1)
 ファイル入力 &文書,行,終了状態=&実行リターン
 if(#文字数([文書])+#文字数(&文書)>3900)
  msgbox "","4000文字超のおそれがありますので、"\
      +&ファイル+"の読み込みは未完とします!"
  繰り返し中止
 end
 行訂正 [文書]=[文書]+"<表に設定してある強制改行文字>"
繰り返し終了
・・・・・・・・
------------------------------------------

但し挙動未確認。

14046 Re:補足:読み込むファイルの一覧 うにん 2001/11/18-16:23
記事番号14042へのコメント
佐田 守弘さん

>補足です。
>読み込み対象ファイルが数千ある様ですので、これをいちいち指定していたらたまりません。
>幅田さんには余計な話になるかも知れませんが、次の様にして、MS-DOSレベルでファイルリスト
>を作成し、これを読み込んで、読み込み対象ファイルのリストを作ります。

どうせ一括処理になるなら、#ファイル検索を使えばファイルリスト自体も桐で作れますよね。
(無理に桐だけでやらなくてもいいんですが:-)

14047 Re:補足:読み込むファイルの一覧 佐田 守弘 2001/11/18-17:21
記事番号14046へのコメント
うにんさん

>どうせ一括処理になるなら、#ファイル検索を使えばファイルリスト自体も桐で作れますよね。
>(無理に桐だけでやらなくてもいいんですが:-)

確かに。
その方が余計な表を作らないだけエレガントですね。

でも、一覧ができたかどうかビジブルに確認できる点がメリットで、私はもっぱらこの方法を使っております。
まあ、要するに表ファイルに書き出す事で、途中までのデバッグができるという点がメリットとでも言えましょうか。


佐田守弘(KS-00119)

14050 Re:ファイル入力コマンドを使ってみては 幅田 2001/11/18-18:39
記事番号14033へのコメント
みなさん、こんにちは。
いつもお世話になっております。

今日は午後から用事があり、その間にたくさんのコメントをいただいて感激しております。

悲しげさん。
>>▼しょうがないので、暫定的に「ファイル入力」コマンドを使ってみました。

この部分を見落としておりました。
No.10181でのコメントを見たとき、ちょうど私も同じことで悩んでおり、
それまで「読み込み」を使っていたところを「ファイル変換 固定長」に
切り替えて解決いたしておりました。

「ファイル入力」コマンドは使ったことがなかったので、
どのように使うのかもよく分からないでおりました。

>今回の幅田さんの場合は逆に、これも残したいと云うことですか
>ら、「ファイル入力」コマンドを使った方法でモロにお望みの結
>果となりそうです。
>------------------------------------------------
>表 "ファイル入力test.tbl"  /*[読込]なる項目あり*/
>cond(.not #空ファイル) 行削除 *,圧縮
>ファイル入力開始 "ファイル入力test.txt",終了状態=&実行リターン
> 繰り返し
>  ファイル入力 &STR,行,終了状態=&実行リターン
>  cond(&実行リターン=-1) 繰り返し中止
>  行追加 [読込]=&STR
> 繰り返し終了
>ファイル入力終了
>表形式編集 ガイド="結果を確認して下さい。"
>---------------------------------------------

ご指導のとおり、上記の一括処理を私用に改良して、組み込んだところバッチリうまくいきました。

pokoponさんには「vbs」での方法も示していただき、これはいろんな面で活用の場がありそうで、参考になりました。

なお、数千件のファイルを指定して読み込む部分はすでに作成済みでしたが、
みなさんのアイデアはすごく参考になりました。
どうもありがとうございました。

今後ともよろしくお願い申し上げます。

戻る