初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2020-07-02 11:09:59

flytetyme
Guest

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

ご教授いただければ幸いです。

#2 2020-07-02 12:03:01

Moz
Member

Re: CSVを加工してインポート

1列目がデータ区分として1はグループ、2はデータ、それ以外は知らん。
次のグループ(1列目が1)が出現するまでのデータは先のグループのデータを付与。

示された情報からテキトーに見た感じですが......正確なパターンを洗い出せますか?

また、その場合もインポート用の中間テーブルを挟む必要があります。
インポート前に元のテキストを加工することは FileMaker だけではできません。

Offline

#3 2020-07-02 15:25:06

Shin
Member

Re: CSVを加工してインポート

テキストを格納しておく 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

#4 2020-07-02 15:54:03

Hiro
Member

Re: CSVを加工してインポート

元本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

#5 2020-07-02 16:05:37

himadanee
Guest

Re: CSVを加工してインポート

「インポート前に元のテキストを加工することは FileMaker だけでは」FM18以後ならスクリプトで「データファイルを開く」でできるはずですが。。。
加工しないでそのままスクリプトでインポートの代替(レコードを1つずつ作る)した方が早いか...

#6 2020-07-02 17:15:13

Moz
Member

Re: CSVを加工してインポート

himadaneeさんが言うとおり、
FileMaker Pro 18 Advanced 以降ならインポートする前に加工できますね。こっちもサーセン。

サンプル)試してちょ
https://bit.ly/3eNOBhY

Offline

#7 2020-07-02 17:23:53

flytetyme
Guest

Re: CSVを加工してインポート

みなさん。ありがとうございます!
本日は時間がない為、明日以降にフィードバックさせていただきます。

#8 2020-07-03 13:57:20

Shin
Member

Re: CSVを加工してインポート

全く別の方法を
  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

#9 2020-07-03 16:53:37

flytetyme
Guest

Re: CSVを加工してインポート

Shinさん。度々ありがとうございます。
後ほど、検証させていただきます。

#10 2020-07-06 09:20:47

flytetyme
Guest

Re: CSVを加工してインポート

おはようございます。
それぞれ試させていただきました。
まずは、Shinさんの2案目をベースにして組み込もうとおもいます。
お忙しいなか、専門的な知識をご教授いただきありがとうございました。

#11 2020-07-06 09:38:14

Shin
Member

Re: CSVを加工してインポート

code 数値フィールド
  日付    テキストフィールド     自動入力:計算式 Case ( code = 1 ; 郵便番号 )]]
  コード  テキストフィールド     自動入力:計算式 Case ( code = 1 ; 住所 )]]
  郵便番号  テキストフィールド     
  住所  テキストフィールド     
  氏名  テキストフィールド     
としておいて、code   郵便番号    住所    氏名  のフィールドにインポートすると、不要なフィールドが減ります。
大量のテキストを処理することを繰り返すのでしたら、ファイル内にフラグメントが発生しますので、時々最小化保存を行うことをお勧めします。

Offline

#12 2020-07-13 11:01:24

flytetyme
Guest

Re: CSVを加工してインポート

Shinさん。お礼が遅くなり申し訳ございません。
度々のアドバイス、本当にありがとうございます。

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.005 seconds, 7 queries executed - Memory usage: 550.35 KiB (Peak: 571.26 KiB) ]