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

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

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

You are not logged in.

Announcement

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


#1 2024-01-11 09:50:21

koko009
Guest

Powershellのコードでタブ文字を使う方法

Powewrshellを使いTSV(csv)ファイルのタブをカウントする下記コードに使われているタブ文字「`t」は、FMのEventを送信スクリプトを使ったコマンドラインの実行では認識されません。
$U = Get-Content $csvFile | ForEach-Object{($_.split("`t")).Count} | Select-Object -First 1
テキストからタブ部分をコピペしたりchar(9)代入する方法でも上手く行きません。何か方法がありましたらお教えください。
使用環境 windows11,FM20.3.1.31

#2 2024-01-11 10:59:10

himadanee
Guest

Re: Powershellのコードでタブ文字を使う方法

Event送信とは関係なく、コマンドプロンプトでは実行できないようです。
ていうか、実際には
powershell -Command "&{}"
の中に書きますよね?するとタブ文字「`t」の前に""の中に"が出てきてしまいますから、何かエスケープしないといけないのでは?

このケースでは他に"は出てこないので、
[char]9
でうまくいくようでした。


ところで、「タブをカウント」でなく「タブで区切られた項目数をカウント」ですよね。(タブの数より1多い)

#3 2024-01-11 11:42:59

koko009
Guest

Re: Powershellのコードでタブ文字を使う方法

確かに
>「タブをカウント」でなく「タブで区切られた項目数をカウント」ですよね。
とするべきでした。
あと申し訳ありませんが
>このケースでは他に"は出てこないので、
>[char]9
>でうまくいくようでした。
の部分が良く理解できません。
因みに、示したコードは、タブ区切りファイルに中に項目部よりデータ部の列が多い事が万が一あった場合を想定して項目の他を除いてexcelシートの所定セル位置から書き出すコードの一部分です。カンマ区切りの場合は問題なく実行できるのですが、この場合項目数が読み取れないため同列同様全ての列が書き込まれる結果となります。

#4 2024-01-11 12:53:25

himadanee
Guest

Re: Powershellのコードでタブ文字を使う方法

`t
の代りに
[char]9
で動きました、ということだったんですが、
「""の中に"が出てきてしまいます」の点は変わらないので、理由付けが変でしたね。
"ではなく、バックティックの解釈の問題ということなのかな??

#5 2024-01-11 13:20:30

koko009
Guest

Re: Powershellのコードでタブ文字を使う方法

$U = Get-Content $csvFile | ForEach-Object{($_.split("[char]9")).Count} | Select-Object -First 1
では、やはり認識されません。PowerShellのエスケープ文字は下記のようになっていますが、コマンドで認識させるのは何か方法があるのかとすればFMの問題でなくなる・・・

PowerShell では、標準文字セットの一部ではない文字を表すために使用される一連の特殊文字シーケンスがサポートされています。 シーケンスは、一般にエスケープ シーケンスと呼ばれます。
エスケープ シーケンスは、バックティック文字 (墓のアクセント (ASCII 96) と呼ばれます) で始まり、大文字と小文字が区別されます。 バックティック文字は、エスケープ文字とも呼ばれます。
エスケープ シーケンスは、二重引用符 (") 文字列に含まれている場合にのみ解釈されます。
PowerShell は、次のエスケープ シーケンスを認識します。
シークエンス     説明
`0     Null
`a     Alert
`b     バックスペース
`e     エスケープ (PowerShell 6 で追加)
`f     フォーム フィード
`n     改行
`r     キャリッジ リターン
`t     水平タブ
`u{x}     Unicode エスケープ シーケンス (PowerShell 6 で追加)
`v     垂直タブ

FMでもそうですがエスケープ文字の処理は良く理解できない。

#6 2024-01-11 14:34:35

himadanee
Guest

Re: Powershellのコードでタブ文字を使う方法

>Eventを送信スクリプトを使ったコマンドラインの実行
もしかして、cmd.exeも使ってますか?
powershell自体がコマンドなので、#2で書いたようにcmd /c は不要で「powershell -Command "&{ ここにコマンドを書く }"
でテストしましたが。                                         ~

#7 2024-01-11 14:52:38

koko009
Guest

Re: Powershellのコードでタブ文字を使う方法

コードテキストを下記の計算式で変数とし
Quote (Substitute (  Pow::コマンド &¶; ¶ ; ";"))
Eventの計算式で
"pwsh -WindowStyle Hidden -Command \"" &$cp

#8 2024-01-11 16:49:07

koko009
Guest

Re: Powershellのコードでタブ文字を使う方法

申し訳ない他のコードとの組み合わせにに問題があったみたい・・・しかしターミナルから実行すれば問題がないのでどこに原因があるか分からない
("`t")を含むコードだけにしどちらでも使えるようにしていた(",")を含むーコードをなくした場合問題なく項目列数だけ書き込める。
理由はよく分からないが、表題のタブ文字の問題ではないみたいなので解決とさせていただきます。お騒がせして申し訳ありませんでした。

#9 2024-01-11 17:21:25

koko009
Guest

Re: Powershellのコードでタブ文字を使う方法

多分カウントにおいてnullが関係していると思うので取りあえず
if ($U -gt 0) { $Q = $U }elseif ($Z -gt 0) {$Q = $Z }
の形でカンマでもタブでも対応できるようにしました。

#10 2024-01-11 18:46:31

koko09
Guest

Re: Powershellのコードでタブ文字を使う方法

また推測が違っていた、
NULLの問題でなかった、どちらも1と項目数が返されていたので下記の条件式に変更してみた。
if ($U -gt $Z) { $Q = $U} else{  $Q = $Z}
しかしターミナルで出来てコマンドラインで何故出来ないか分からないが・・・

#11 2024-01-12 13:03:19

koko009
Guest

Re: Powershellのコードでタブ文字を使う方法

FMとは全く関係がない報告です。
明示的に数値とすると
$U = [int](Get-Content $csvFile | ForEach-Object{($_.split("`t")).Count} | Select-Object -First 1)
if式でなく以前の
$Q = [math]::max($Z,$U)
で問題なく動く、何故カンマの場合は問題がなくタブの場合に引っかかるのか不明ですが・・・

#12 2024-01-12 17:15:23

himadanee
Guest

Re: Powershellのコードでタブ文字を使う方法

#9以降のコメントは変数が全く意味不明なので、せっかく書くなら全体を書いてください。何も追試もコメントもできません。
最後の「明示的に数値とすると」というところは、比較するなら数値にしないとだめだろうという気はしますが...("10"<"2"ですから)

最初の投稿でも計算の結果を変数に代入しているだけなので、書かれてるコマンド自体に問題があるのか他の部分の問題なのかということはあったんですが、
コマンドラインで実行する際にバックティックが問題になることは再現できてました。
カンマはただの文字ですがタブはコントロールコードで文字として書けないから引っ掛かるんでしょうけど [char]9で解決しないなら別の問題な感じがします。

ちなみにこちらのPowershellはバージョンが古いみたいでpwsh.exeではありませんでした。
Win10からアップグレードしたWin11で入ってるままのもので、「最新の PowerShell をインストールしてください」て出るんだけど普段使わないのでそのままになってます。
この際入れてみるか...

#13 2024-01-13 06:28:34

koko009
Guest

Re: Powershellのコードでタブ文字を使う方法

申し訳ないが以前のコードをここに書き込むためコマンドラインで再度試したところ問題なく実行された。その理由は、直近の投稿の後こちらのpowershellのバージョン7.4.0から7.4.1に上げた結果だと思われる。
以前のコードを参考のため載せておきます。このコードは、再度申し上げますがv7.4.0ではターミナルから実行しても問題なく結果が反映されるがFMからコマンドラインを使うと実行結果に反映されなかったたのです。

$csvFile = "D:\powershell\pp003.csv"
$excelPath = "d:\test\AAA.xlsx"
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$workbook = $excel.Workbooks.Open((Get-Item $excelPath).FullName)
$sheet = $workbook.Worksheets.Item(1)
$U = Get-Content $csvFile | ForEach-Object{($_.split("`t")).Count} | Select-Object -First 1
$Z = Get-Content $csvFile | ForEach-Object{($_.split(",")).Count} | Select-Object -First 1
$Q = [math]::max($Z,$U)
$W = 16384 - $Q
$startRange = "B2"
$outputColumn = $sheet.Range($startRange).Column
$outputRow = $sheet.Range($startRange).Row
$QueryTable = $sheet.QueryTables.Add("TEXT;$csvFile",$sheet.cells($outputRow,$outputColumn))
$QueryTable.TextFileCommaDelimiter = $True
$QueryTable.AdjustColumnWidth = $false
$QueryTable.TextFilePlatform = 65001
$QueryTable.TextFileStartRow = 1
$QueryTable.TextFileColumnDataTypes = (1..$Q | ForEach-Object{ 1 })+(1..$W | ForEach-Object{ 9 })
$QueryTable.Refresh($false)
$QueryTable.Name = "仮テーブル"
$QueryTable.Delete()
foreach($n in $book.Names){If ($n.Name -Like $loadSheetName + "!" + "仮テーブル*") {$n.Delete()}}
$sheet.Range("A1").Select()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet) > $null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) > $null
[gc]::Collect()

因みに古い"powershell -WindowStyle Hidden -Command \"" &$cpで試したところv7.4.1では反映されていませんでした。

#14 2024-01-13 08:15:24

himadanee
Guest

Re: Powershellのコードでタブ文字を使う方法

あああ、すいません、Powershell7.4.0を入れてみましたが、古いバージョン5とは色々動作が違うようで、この件については
$_.split("[char]9")
だとだめで
$_.split([char]9)
としないとタブ文字を検索しないようです。
(バージョン5ではどっちでも同じ)

[char]9はここ
https://stackoverflow.com/questions/206 … powershell
を見たのですが、""は使ってないですね。
#4を書くときに、「あれ?」と思ったんですが、#2の時は""を使わずに書いてた(だから「他に""がないので」と言っている)のを、#4のとき再度やり直すのに""の中だけ書き換えて動いたのでそのように書いてしまったようです。

古いPowershell

新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows

PS C:\Users\user> Get-Content "d:\fmp\20230404.tab" | ForEach-Object{($_.split([char]9)).Count} | Select-Object -First 1
2
PS C:\Users\user>  Get-Content "d:\fmp\20230404.tab" | ForEach-Object{($_.split("[char]9")).Count} | Select-Object -First 1
2

新しいpwsh

PS C:\Users\user> Get-Content "d:\fmp\20230404.tab" | ForEach-Object{($_.split("`t")).Count} | Select-Object -First 1
2
PS C:\Users\user> Get-Content "d:\fmp\20230404.tab" | ForEach-Object{($_.split("[char]9")).Count} | Select-Object -First 1
1
PS C:\Users\user> Get-Content "d:\fmp\20230404.tab" | ForEach-Object{($_.split([char]9)).Count} | Select-Object -First 1
2

pwshで"[char]9"の場合だけ見つからない(というかタブを検索してない)ので結果が1になってます。

あ、ファイル名を変数に入れないで""で囲んでますが、ここは''でいいので、「[char]9にすれば他に""がない」状態です。

FMのバージョンは気にしてましたが、他のも気を付けないとだめですね...あたりまえか...反省

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.008 seconds, 9 queries executed - Memory usage: 554.61 KiB (Peak: 575.52 KiB) ]