みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
下記のテキストデータを、
1,20200701,ABC01
2,100-0001,東京都千代田区XXXX,山田太郎
2,261-0001,千葉県千葉市XXXX,佐藤一郎
8,00002
1,20200701,ABC02
2,103-0001,東京都中央区XXXX,鈴木花子
2,273-0001,千葉県船橋市XXXX,田中幸一
8,00002
9,00004
このようにインポートしたいのです。
100-0001 東京都千代田区XXXX 山田太郎 20200701 ABC01
261-0001 千葉県千葉市XXXX 佐藤一郎 20200701 ABC01
103-0001 東京都中央区XXXX 鈴木花子 20200701 ABC02
273-0001 千葉県船橋市XXXX 田中幸一 20200701 ABC02
ご教授いただければ幸いです。
1列目がデータ区分として1はグループ、2はデータ、それ以外は知らん。
次のグループ(1列目が1)が出現するまでのデータは先のグループのデータを付与。
示された情報からテキトーに見た感じですが......正確なパターンを洗い出せますか?
また、その場合もインポート用の中間テーブルを挟む必要があります。
インポート前に元のテキストを加工することは FileMaker だけではできません。
Offline
テキストを格納しておく g_テキスト(グローバルテキストフィールド)
g_ln(グローバル数値フィールド)
g_日付(グローバルテキストフィールド)
g_コード(グローバルテキストフィールド)
を作ります。
g_ln = ln
g_日付 = 日付
g_コード = コード
という自己リレーションを張り、レコードの作成を許可します。
g_テキスト に、目的のテキストを貼り付け、次のスクリプトを走らせればいいでしょう。
フィールド設定 [ テーブル::g_ln ; 1 ]
Loop
変数を設定 [ $txt1 ; 値: Let ( $txt = Substitute ( GetValue ( テーブル::g_テキスト ; テーブル::g_ln ) ; "," ; ¶ ) ; GetValue ( $txt ; 1 ) ) ]
If [ $txt1 = 1 ]
フィールド設定 [ テーブル::g_日付 ; GetValue ( $txt ; 2 ) ]
フィールド設定 [ テーブル::g_コード ; GetValue ( $txt ; 3 ) ]
Else If [ $txt1 = 2 ]
フィールド設定 [ テーブル 2::郵便番号 ; GetValue ( $txt ; 2 ) ]
フィールド設定 [ テーブル 2::住所 ; GetValue ( $txt ; 3 ) ]
フィールド設定 [ テーブル 2::氏名 ; GetValue ( $txt ; 4 ) ]
Else If [ $txt1 = 8 ]
Else If [ $txt1 = 9 ]
End If
フィールド設定 [ テーブル::g_ln ; テーブル::g_ln + 1 ]
Exit Loop If [ テーブル::g_ln > ValueCount ( テーブル::g_テキスト ) ]
End Loop
https://www.dropbox.com/s/1eibvueqqaavt … 2.zip?dl=0
Last edited by Shin (2020-07-03 13:57:40)
Offline
元本CSVファイルを、FMを使って目的データ構成へ書式修正する案は、如何でしょうか。
(※ファイル修正後は、単純に標準CSVインポートすれば良いでしょう。)
【元データ】
1,20200701,ABC01
2,100-0001,東京都千代田区XXXX,山田太郎
2,261-0001,千葉県千葉市XXXX,佐藤一郎
8,00002
1,20200701,ABC02
2,103-0001,東京都中央区XXXX,鈴木花子
2,273-0001,千葉県船橋市XXXX,田中幸一
8,00002
9,00004
↓
【修正結果データ】
100-0001,東京都千代田区XXXX,山田太郎,20200701,ABC01
261-0001,千葉県千葉市XXXX,佐藤一郎,20200701,ABC01
103-0001,東京都中央区XXXX,鈴木花子 20200701,ABC02
273-0001,千葉県船橋市XXXX, 田中幸一,20200701,ABC02
修正作業用に1フィールドだけのFMテーブルを用意する。
これへ、元ファイルデータを1CSV行1FMレコードとして「改行区切りtext形式」インポートする。
・ 1,20200701,ABC01
・ 2,100-0001,東京都千代田区XXXX,山田太郎
・ 2,261-0001,千葉県千葉市XXXX,佐藤一郎
・ 8,00002
・ 1,20200701,ABC02
・ 2,103-0001,東京都中央区XXXX,鈴木花子
・ 2,273-0001,千葉県船橋市XXXX,田中幸一
・ 8,00002
・ 9,00004
計算値「フィールド内容の全置換」で作業フィールド(CSV行データ内容) を一括編集する。
その式:
Let(
[$add=Case(Left(作業フィールド;1)=1; Replace(作業フィールド;1;1;""); $add)];
Case(Left(作業フィールド;1)=2; Replace(作業フィールド;1;2;"")&$add)
)
その結果:
・
・ 100-0001,東京都千代田区XXXX,山田太郎,20200701,ABC01
・ 261-0001,千葉県千葉市XXXX,佐藤一郎,20200701,ABC01
・
・
・ 103-0001,東京都中央区XXXX,鈴木花子,20200701,ABC02
・ 273-0001,千葉県船橋市XXXX,田中幸一,20200701,ABC02
・
・
これから、空欄レコードを削除する。
・ 100-0001,東京都千代田区XXXX,山田太郎,20200701,ABC01
・ 261-0001,千葉県千葉市XXXX,佐藤一郎,20200701,ABC01
・ 103-0001,東京都中央区XXXX,鈴木花子,20200701,ABC02
・ 273-0001,千葉県船橋市XXXX,田中幸一,20200701,ABC02
この結果を「改行区切りtext形式」でエクスポートする。
最後に、この出力ファイル.csvをテキストエディタで確認してお終い。
100-0001,東京都千代田区XXXX,山田太郎,20200701,ABC01
261-0001,千葉県千葉市XXXX,佐藤一郎,20200701,ABC01
103-0001,東京都中央区XXXX,鈴木花子,20200701,ABC02
273-0001,千葉県船橋市XXXX,田中幸一,20200701,ABC02
Offline
「インポート前に元のテキストを加工することは FileMaker だけでは」FM18以後ならスクリプトで「データファイルを開く」でできるはずですが。。。
加工しないでそのままスクリプトでインポートの代替(レコードを1つずつ作る)した方が早いか...
himadaneeさんが言うとおり、
FileMaker Pro 18 Advanced 以降ならインポートする前に加工できますね。こっちもサーセン。
サンプル)試してちょ
https://bit.ly/3eNOBhY
Offline
みなさん。ありがとうございます!
本日は時間がない為、明日以降にフィードバックさせていただきます。
全く別の方法を
code 数値フィールド
Fld2 テキストフィールド
Fld3 テキストフィールド
Fld4 テキストフィールド
日付 テキストフィールド 自動入力:計算式 Case ( code = 1 ; Fld2 )]]
コード テキストフィールド 自動入力:計算式 Case ( code = 1 ; Fld3 )]]
郵便番号 テキストフィールド 自動入力:計算式 Case ( code = 2 ; Fld2 )]]
住所 テキストフィールド 自動入力:計算式 Case ( code = 2 ; Fld3 )]]
氏名 テキストフィールド 自動入力:計算式 Case ( code = 2 ; Fld4 )]
を作り、元のテキストをcsvで、code,Fld2,Fld3,Fld4へインポートます。
レコードのインポート [ ダイアログあり: オン ; 追加; シフト JIS ]
フィールド内容の全置換 [ ダイアログあり: オン ; テーブル2::日付 ; Let ( $txt = Case ( IsEmpty ( テーブル2::日付 ) ; $txt ; テーブル2::日付 ) ; $txt ) ]
フィールド内容の全置換 [ ダイアログあり: オン ; テーブル2::コード ; Let ( $txt = Case ( IsEmpty ( テーブル2::コード ) ; $txt ; テーブル2::コード ) ; $txt ) ]
検索実行 [ 記憶する ] //code=2 を除外
対象レコード削除 [ ダイアログあり: オフ ]
を走らせる。
https://www.dropbox.com/s/1eibvueqqaavt … 2.zip?dl=0
Last edited by Shin (2020-07-04 09:32:13)
Offline
Shinさん。度々ありがとうございます。
後ほど、検証させていただきます。
おはようございます。
それぞれ試させていただきました。
まずは、Shinさんの2案目をベースにして組み込もうとおもいます。
お忙しいなか、専門的な知識をご教授いただきありがとうございました。
code 数値フィールド
日付 テキストフィールド 自動入力:計算式 Case ( code = 1 ; 郵便番号 )]]
コード テキストフィールド 自動入力:計算式 Case ( code = 1 ; 住所 )]]
郵便番号 テキストフィールド
住所 テキストフィールド
氏名 テキストフィールド
としておいて、code 郵便番号 住所 氏名 のフィールドにインポートすると、不要なフィールドが減ります。
大量のテキストを処理することを繰り返すのでしたら、ファイル内にフラグメントが発生しますので、時々最小化保存を行うことをお勧めします。
Offline
Shinさん。お礼が遅くなり申し訳ございません。
度々のアドバイス、本当にありがとうございます。
Pages: 1
[ Generated in 0.010 seconds, 10 queries executed - Memory usage: 550.87 KiB (Peak: 571.77 KiB) ]