みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
ファイルメーカープロ11 win8.1 win10です。
どうかよろしくお願いします。
表題のとおりリスト(100列200レコード程度)をUTF-8形式で書出したいのですが、
ver11にはUTF-8の項目が見当たりません。
何か手立てはありますでしょうか?
ご指導お願いします。
Offline
CSVもTSVも、UTF-8ありますよ。
「フィールドデータのエクスポート順」というダイアログの
オプション「出力ファイルの文字セット」の選択肢から選択できると思いますが、
出力するファイルの種類によって、選択肢が変わるようです。
少なくとも、*.tab、*.csvでは、UTF-8は選択できるようですよ。
( Windows10 FMPA11.0v3にて確認 )
みなさんありがとうございます。
確認した所、おっしゃるように.csvならUTF-8を選択できるようです。確認不足で申し訳ありません。
実はエクスポートするデータに見出し(フィールド名)をつける形になっているのでファイル形式は
.merでファイル名はhogehoge.csvという形で書き出しており、.merはUTF-8の選択肢がありませんでした。
ファイル形式を.csv(UTF-8)として見出し(フィールド名)を追記する方法はありますでしょうか。
Offline
追記です。
スクリプトで新規レコードを作成して各フィールドにフィールド名を設定、処理後削除するという
やり方がネットにありました。解決!と思ったのですが、現状の見出し(.mer)には""(ダブルコーテーション)が
ついてませんので、この策では残念ながらダメなようです。
引き続きよろしくお願いします。
Offline
UTF-8に変換できるのはCSVかTAB形式に限られるので、FM機能だけでMER出力は無理でしょう。
やるなら、一旦CSVで書き出したファイルを、利用可能な外部スクリプトでタイトルヘッダ行を書き加える、とか?
Win環境なら「HTA」スクリプトをEvent送信する方法が良いかな!
Offline
ヘッダファイルをあらかじめ作っておけば(オブジェクトフィールドからエクスポートも可)、copyコマンドで連結というのもできます。
バージョンアップすれば、merファイルでもUTF-8が選択できます。さすがにFM11は寿命では。
PowerShellでヘッダー行を足すのがはやいのですが、
FileMakerだけでやるなら出力用テーブルを作成し、1レコード目にヘッダー行を作成し、それ以降に出力したいテーブルからレコードをインポート、→ CSV エクスポート で良いのでは。
Offline
スクリプトで新規レコードを作成して各フィールドにフィールド名を設定、処理後削除するという
やり方がネットにありました。解決!と思ったのですが、現状の見出し(.mer)には""(ダブルコーテーション)が
ついてませんので、この策では残念ながらダメなようです。
引き続きよろしくお願いします。
出力したデータは何に使うのでしょう?
ダブルクォーテーションの有無は、CSVの仕様に沿っていれば問題ありません。
Offline
皆さんありがとうございます。
FM11寿命ですか。バージョンアップの頻度に挫折したものの一人です。
CSVファイルは規定にそっていればどうでもいいと言うことでしたが、その後1行目以外はダブルコーテーションで
囲むよう指示されています。
おさめているFMが11である以上バージョンアップしないとUTF-8での書き出しは無理なことを伝えようと思います。
UTF-8に変換できるのはCSVかTAB形式に限られるので、FM機能だけでMER出力は無理でしょう。
やるなら、一旦CSVで書き出したファイルを、利用可能な外部スクリプトでタイトルヘッダ行を書き加える、とか?
Win環境なら「HTA」スクリプトをEvent送信する方法が良いかな!
知識のない私ですが簡単にできるものでしょうか?
よろしければご指導ください。
Offline
powershellでSJISからUTF8に簡単に変換できるというので、FMに実装してみました。
変数を設定 [ $path; 値:Get(デスクトップパス) & "filename.mer" ]
レコードのエクスポート [ ファイル名: 「$path」; 文字セット: 「日本語 (Shift-JIS)」; フィールド順: ][ ダイアログなし]
変数を設定 [ $path; 値:Substitute ( Replace ( $path ; 1 ; 1 ; "" ) ; "/" ; "\\" ) ]
変数を設定 [ $path2; 値:Substitute ( $path ; ".mer" ; ".csv" ) ]
Event送信 [ ファイル/アプリケーションを開く; "cmd /c powershell -command \"Get-Content " & $path & " | Set-Content -Encoding utf8 " & $path2 & "\"" ]
あぁ、タイトル付MERで標準書き出して、Powershell でUTF-8へ単純一括変換するのが安全確実ですネ!
Offline
himadaneeさん、ありがとうございます。
早速試してみたいと思います。
取り急ぎお礼まで。
Offline
himadaneeさん
結論からいきますとうまく行きました。ありがとうございます。
しかし「filename.mer」ファイルが残ってしまうので削除?したいのですがどうすればよいですか。
また、最初の書出しでmerge形式でファイル名を「filename.csv」とすれば後からの「Substitute ( $path ; ".mer" ; ".csv" )」を
除いて簡潔にできないかなどと無い知恵をしぼりましたがいずれもうまく行きませんでした。
よろしくお願いします。
Offline
変換後、2秒ほど停止した後、cmd Remove-Itemで削除することが出来ました。
簡潔化についてはテスト中ですが、さほど時間も要さないのでこれで満足しています。
Offline
psコマンドの追加は、セミコロンで区切ればいいようです。
"cmd /c powershell -command \"Get-Content " & $path & " | Set-Content -Encoding utf8 " & $path2 & " ; Remove-Item " & $path & "\""
あとは、ファイル名(パス)にスペースがある場合の対処とかは必要かもしれません。
パス名を1つで済ますには、リダイレクトでなく中身をpsの変数に取り込んで、ファイルを削除した後書き出す、とかできそうだけど...
PowerShellでの方法は言い出しっぺなので、追記しておきます。
Shift-jisで書き出してUTF-8に変更した場合、UTF-8にあってShift-jisに無い文字が欠けてしまいます。(そういった文字がない場合は問題なし)
なので、CSV(UTF-8)でエクスポートし、タイトル行を足す方法をお勧めします。
$header=@('title01','title02','title03');
の所に追加したいタイトルを記入
PowerShell でCSVファイルの先頭にヘッダー行を追加する例:
(BOMあり)
変数を設定 [ $path; 値:Get(デスクトップパス) & "filename.csv" ]
レコードのエクスポート [ ファイル名: 「$path」; 文字セット: 「Unicode (UTF-8)」; フィールド順: test::F1 test::F2 ]
変数を設定 [ $pathWin; 値:Substitute ( Replace ( $path ; 1 ; 1 ; "" ) ; "/" ; "\\" ) ]
変数を設定 [ $PowerShell; 値:"$header=@('title01','title02','title03'); $path='{PATH}'; $data= @(Get-Content $path); $data[0]=($header -join ',') +[char]10 + $data[0]; $data | Out-File $path -Encoding UTF8;" ]
変数を設定 [ $PowerShell; 値:Substitute ( $PowerShell ; "{PATH}" ; $pathWin ) ]
Event を送信 [ ファイル/アプリケーションを開く; "powershell -windowstyle hidden -Command \"" & $PowerShell & "\"" ]
(BOMなし)
変数を設定 [ $path; 値:Get(デスクトップパス) & "filename.csv" ]
レコードのエクスポート [ ファイル名: 「$path」; 文字セット: 「Unicode (UTF-8)」; フィールド順: test::F1 test::F2 ]
変数を設定 [ $pathWin; 値:Substitute ( Replace ( $path ; 1 ; 1 ; "" ) ; "/" ; "\\" ) ]
変数を設定 [ $PowerShell; 値:"$header=@('title01','title02','title03'); $path='{PATH}'; $data= @(Get-Content $path); $data[0]=($header -join ',') +[char]10 + $data[0]; $UTF8NoBomEnc = New-Object System.Text.UTF8Encoding $False; [System.IO.File]::WriteAllLines($path, $data, $UTF8NoBomEnc);" ]
変数を設定 [ $PowerShell; 値:Substitute ( $PowerShell ; "{PATH}" ; $pathWin ) ]
Event を送信 [ ファイル/アプリケーションを開く; "powershell -windowstyle hidden -Command \"" & $PowerShell & "\"" ]
Last edited by qb_dp (2021-05-17 16:06:40)
Offline
返信遅くなりました。
himadaneeさんありがとうございます。
psコマンドの追加は、セミコロンで区切ればいいようです。
"cmd /c powershell -command \"Get-Content " & $path & " | Set-Content -Encoding utf8 " & $path2 & " ; Remove-Item " & $path & "\""
スクリプトの停止不要になりますね。感謝です。
パス名はファイルと同じ階層にあるフォルダに収納したくて試行錯誤しましたが、上手く動いてくれています。
qb_dpさんありがとうございます。
わざわざコードの表示感謝します。
私には敷居が高くて解読、設置には時間がかかりそうですが、テストしてみたいと
思います。
一旦閉じます。みなさん、ありがとうございました。
Offline
Pages: 1
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 558.15 KiB (Peak: 578.69 KiB) ]