アプリ版:「スタンプのみでお礼する」機能のリリースについて

https://oshiete.goo.ne.jp/qa/9818180.html
上記質問の続きです。

サクラエディタのGrep機能で一括で12桁の数字を抜き出すことはできたのですが、
上記質問の『例)kansei.txt』の形式で出力ができませんでした。
Grepツールで出力結果を細かく指定して出力できるものはありますか?
Grepの結果に毎回自分で置換を行えば目的のものは得られますが、同様の作業を何度も行う予定なので楽にできる方法があればと思っています。

自分でも調べましたが出力結果について明確に説明されているものは少なく、
Grepと同じようなコマンドプロンプトのfindstrや、PowershellのSelect-Stringも調べましたが
できるのかわからなかったので質問しました。

PCはWindows7です。

A 回答 (7件)

N0.3のお礼を拝見しました。


12桁の途中で改行が入るということですよね?
では、以下でどうでしょう

-----ここから
$me = "search.ps1" # 本スクリプトファイル名
$out = "kansei.txt" # 出力ファイル名

Get-ChildItem | %{
$name = $_.Name
if(($name -ne $me) -and ($name -ne $out)){
$s = Get-Content $_
if($s.gettype().Name -eq "Object[]"){$s = $s -join ""}
if($s -match "\d{12}"){
"$($Matches[0]) $($_.FullName)" | Out-File -FilePath $out -Append
}
}
}
----ここまで
    • good
    • 0
この回答へのお礼

完璧です。
大変助かりました。
ありがとうございました。

お礼日時:2017/07/10 14:58

No.2です。


バイナリファイル用に書き換えてみました。

search.ps1
-----ここから
$me = "search.ps1" # 本スクリプトファイル名
$out = "kansei.txt" # 出力ファイル名


function get_num12([string]$file){
$size = 12
[byte[]]$bs = [IO.File]::ReadAllBytes($file)

$begin = -1
$cnt = 0
for([int32]$i = 0;$i -lt $bs.Length; $i++){
if(($bs[$i] -ge 0x30) -and ($bs[$i] -le 0x39)){
if($begin -eq -1){
$begin = $i
$cnt++
} else {
$cnt++
if($cnt -eq $size){break}
}
} else {
$begin = -1
$cnt = 0
}
}

$num = ""
if($begin -ne -1){
for([int32]$i = $begin; $i -lt $begin + $size; $i++){
$num = $num + ($bs[$i] - 0x30)
}
}
return $num
}

Get-ChildItem | %{
$name = $_.Name
if(($name -ne $me) -and ($name -ne $out)){
$num = get_num12($_.FullName)
if($num -ne ""){
"$($num) $($_.FullName)" | Out-File -FilePath $out -Append
}
}
}
-----ここまで
    • good
    • 0

あなたの環境にruby1.9以上がインストールされているか、


rubyをインストールしてでも、この問題を解決したいということであれば、
この問題の解決の為のrubyのスクリプトを提供することは可能です。
いかがいたしましょうか。
    • good
    • 0

こんにちは。



手動でも可能ですが、VBSにしてみました。
本家のGNU Grepは、まだ残っていますでしょうか?GNU Grep を使っています。
#2さんご指摘のように、これは、not text =binary だとすると、binary mode で検索しなければなりません。

cmd ="C:\Program Files\GnuWin32\bin\grep.exe -o -e --text "
(注意:コードの行の末尾には空白が入っているものがありますが、それは削除しないでください。)これは、全部がバイナリに限ります。汎用性が利きません。

また、以下のコードの対応テキストは、SJISとUTF-8で、Unicode は利用できません。
被検索のテキストファイルを、nkf.exe でとSJISに変更してから検索しないといけませんでした。条件さえ揃えば、便利だは思います。
GNU grep.exe 2.5.4 (古い)
正規表現の、"\d{12}" が使えませんでした。
検索する拡張子は、適宜変えてください。

''SeachNos_Grep.vbs
Dim cmd, myOption
Dim WshShell, objFS, objTextm,objRes
dim WshScriptExec

Set WshShell = CreateObject("WScript.Shell")
Set objFS = CreateObject("Scripting.FileSystemObject")
cmd ="C:\Program Files\GnuWin32\bin\grep.exe -o -e "
myOption = "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] "
''the extention is required to change.
Set WshScriptExec = WshShell.Exec(cmd & myOption &"*.zzz")
txOut=""
Set objRes = WshScriptExec.StdOut
Set objText =objFS.CreateTextFile("kansei.txt")
Do While objRes.AtEndOfStream = False
objText.Writeline ( objRes.Readline )
Loop
objText.Close
WScript.Sleep(100)
Msgbox "終了"
WScript.Quit

'-----------------------------
kansei.txt
ファイル名 と pattern にmatch した文字列 の順に出ます。

例:
048156660.txt:321545487489

ご質問者さんの環境では、成功率は半々というところかな。
    • good
    • 0
この回答へのお礼

ありがとうございます。
GNU Grepは入っていないです。
VBSの方が経験があるので今後行き詰ったときに参考にさせていただきます。

お礼日時:2017/07/10 15:07

No2です。



> ファイルの場所が入っていない

"$($Matches[0]) $($name)"
 ↓
"$($Matches[0]) $($_.FullName)" の誤りでした。


> また、下記のエラーが20件出ます。

-match演算子で12桁の数字のマッチはしてるようですが、その数字がキャプチャできてないようですね。
検索対象がテキストファイルでないことが原因で上手くいかないのだと思いますが
実際のデータが手元にないので、よくわかりません。
    • good
    • 0
この回答へのお礼

土日はPCが使えないので遅くなりました。
ありがとうございます。
おかげさまでファイルの場所が正しく入りました。
実際のデータは改行があるので12桁が取得できないようです。
大体3~4行目に12桁の数字があります。
試しに改行を消してみるとうまくいきました。改行を無視して12桁を取得することはできるのでしょうか?
自分でもこれから調べてみますが今の時点ではわからないので、もし余裕がありましたら教えてください。

お礼日時:2017/07/10 10:10

もっと良い方法があるかもしれませんが


PowerShellのスクリプトだとこんな感じでしょうか。

スクリプトファイルのある場所を検索対象にします。

search.ps1
-----ここから
$me = "search.ps1" # 本スクリプトファイル名
$out = "kansei.txt" # 出力ファイル名

Get-ChildItem | %{
$name = $_.Name
if(($name -ne $me) -and ($name -ne $out)){
if((Get-Content $_) -match "\d{12}"){
"$($Matches[0]) $($name)" | Out-File -FilePath $out -Append
}
}
}
-----ここまで
    • good
    • 0
この回答へのお礼

ありがとうございます。
教えていただいたスクリプトを試しに20ファイルある場所に置いて実行したところ、
作成されたkansei.txtに『(半角スペース)ファイル名』だけが20行(12桁とファイルの場所が入っていない)
また、下記のエラーが20件出ます。
『null 配列にインデックスを付けることはできません。
発生場所 C:\(ファイルの場所)\search.ps1:8 文字:10
+ $Matches[ <<<< 0]
+ CategoryInfo : InvalidOperation: (0:Int32) []、RuntimeException
+ FullyQualifiedErrorId : NullArray 』
原因わかりますでしょうか。

お礼日時:2017/07/07 12:03

GNU grep?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!