たっぷす庵 様 「PowerShellでifの戻り値パイプ出来ないの巻」
空のパイプ要素は許可されていません。
for文でパイプ
即時関数
「Cookie の使用に同意するものと見なされます。」がでます。
https://stuncloud.wordpress.com/2016/01/13/powershell_cant_pipe_if/
環境 Windows7 32bit PowerShell version 2.0
PS C:\Users\user\desktop> for($i=0;$i -lt 16;$i++){"ITドカタの世界へようこそ $i"}|out-file -encoding default a777.txt
空のパイプ要素は許可されていません。
発生場所 行:1 文字:46
+ for($i=0;$i -lt 16;$i++){"ITドカタの世界へようこそ $i"}| <<<
+ CategoryInfo : ParserError: (:) []、ParentContainsErrorRecordException
+ FullyQualifiedErrorId : EmptyPipeElement
PS C:\Users\user\desktop>
PS C:\Users\user\desktop> &{for($i=0;$i -lt 16;$i++){"ITドカタの世界へようこそ $i"}}|out-file -encoding default a777.txt
PS C:\Users\user\desktop>
<20181127追記STA>PowerShellでSJIS固定長CrLf(改行)なしにCrLf(改行コード)を付加してレコード単位にする
インフラSEの運用・構築メモ 様
[PowerShell] テキストファイルをバイト単位で切り出す
http://rtaki.sakura.ne.jp/infra/?p=2783
(1)$enc = [System.Text.Encoding]::Default
(2)$bytes = $enc.GetBytes(($f_text = gc FIXED150.txt))
(2-1)$f_text.length でレングス確認(文字数になる)
もしくは
$bytes = $enc.GetBytes((gc FIXED150.txt))
(2-2)$bytes.length で確認(バイト数になる)
(3)$len = 150 #<=忘れると無限ループにはまります。要注意。
(4)&{for($i=0; $i -lt $bytes.length; $i = $i + $len){$enc.GetString($bytes,$i,$len)}} | out-file out_fixed150.txt -encoding default
<20181127追記END>
<20181129追記STA>PowerShellでCrLf(改行コード)なしSJIS固定長を項目単位に分割する。タブ区切り化。
PS C:\Users\user> cd desktop
PS C:\Users\user\desktop> $enc = [System.Text.Encoding]::Default
PS C:\Users\user\desktop> $bytes = $enc.GetBytes((gc FIXED150.txt))
PS C:\Users\user\desktop> $bytes.length
150000
PS C:\Users\user\desktop> $len = 150 #<=忘れると無限ループにはまります。要注意。
PS C:\Users\user\desktop> [int[]]$arr = @(2,15,10,8,115)
PS C:\Users\user\desktop> [string[]]$item = @(0..4)
PS C:\Users\user\desktop>
&{for($i=0; $i -lt $bytes.length; $i= $i + $len){
$pos = $i
for($j=0; $j -lt $arr.length; $j++){
$item[$j] = $enc.GetString($bytes, $pos, $arr[$j])
$pos = $pos + $arr[$j]
}
$item -join "`t"
}
} | out-file a888.txt -encoding default
<20181129追記END>
<固定長の種>
'<Fixed_seed.vbs>
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim TargetFile 'As String
Dim oFS 'As Object
Dim oFR 'As Object
Dim oFW 'As Object
Dim i 'As Long
Dim out_area(4)
Dim KBN
Call Make_out
TargetFile = "FIXED150.txt"
Set oFS = CreateObject("Scripting.FileSystemObject")
Set oFW = oFS.OpenTextFile(TargetFile, ForWriting, True)
For i = 1 To 1000
'KBN = Int(Rnd()*5)
KBN = "02"
'CrLf付き
'oFw.Writeline out_Area(KBN)
'Crlf無し
oFw.Write Right("00" & i,2) & MID(out_Area(KBN),3,147)
Next
oFW.Close
Set oFW = Nothing
Set oFS = Nothing
MsgBox "処理終了"
Function Make_out()
out_area(0) = "00" & _
String(005,"A") & "#" & _
String(141,"B") & "#"
out_area(1) = "01" & _
String(014,"C") & "#" & _
String(059,"D") & "#" & _
String(072,"E") & "#"
out_area(2) = "02" & _
"FあFFいいFFFう#" & _
"GかGGきGG#" & _
"HHHさHH#" & _
String(114,"J") & "#"
'out_area(2) = "02" & _
' String(014,"F") & "#" &
' String(009,"G") & "#" &
' String(007,"H") & "#" &
' String(114,"J") & "#"
out_area(3) = "03" & _
String(014,"K") & "#" & _
String(059,"L") & "#" & _
String(023,"M") & "#" & _
String(001,"N") & _
String(047,"P") & "#"
out_area(4) = "99" & _
String(008,"Q") & "#" & _
String(138,"R") & "#"
End Function
<20181130追記STA>
文字列を特定の長さで改行する方法
「Linuxのfoldコマンドと同等のことを、PowerShellで行いたい」
関係ないけど、パック10進数含むようなバイナリデータを扱うなら、perlが一番入手しやすくて、短く書けて、速くていいとおもいます。
perl58.dll <=versionでかわります。
perl.exe
さえあれば動きます。
「くんすとの備忘録」様
http://kunst1080.hatenablog.com/entry/2014/04/10/233257
固定長を区切るのも、以下は無理やりironRubyで書きましたけど、perlでできるし。
パック10進数を文字形式に変換するのも、そんなにむずかしくはないはず。
<自己記事>IronRubyでSJIS改行(CrLf)なし固定長めった斬り
https://blog.goo.ne.jp/tkhs1732/e/9edb7bb22c879f2076abc4e24e5b47a2
あとは、VB.NET か C#.NET。 さくっとその目的専用のコードを書いて(汎用なfoldをつくるのではない。作っていただけるとありがたいです。)、コンパイルして、exe作るとか?
<20181130追記END>
<20181201追記STA>全角"<" ">" を 半角"<" ">"にしてください。
PowerShellではありません。Perlですが、項目数が少なく かつ データ件数も10000件くらいなら
jperl -bpe "s/(.{2})(.{15})(.{10})(.{8})(.{115})/$1\t$2\t$3\t$4\t$5\n/g;" <FIXED150.TXT >smosmo.txt
perl -pe "s/(.{2})(.{15})(.{10})(.{8})(.{115})/$1\t$2\t$3\t$4\t$5\n/g;" <FIXED150.TXT >smosmo2.txt
$1~$10まで
こんなのでもいけます。
鬼車SED
onigsed -R --ctype=ASCII "s/(.{2})(.{15})(.{10})(.{8})(.{115})/\1\t\2\t\3\t\4\t\5\n/g;" < FIXED150.TXT >hiyohiyo.txt
下記どちらも\1~\9まで
-r, --regexp-extended
use extended regular expressions in the script.
-R, --regexp-perl
use Perl 5's regular expressions syntax in the script.
<20181201追記END>
<20181207追記STA>PowerShell
環境 Windows10 64bit PowerShell version 5.0 にて動かす機会があった。
性能のいいマシンならそこそこ動くと思われる。
Windows7 32bit PowerShell version 2.0 の低スペックノートPCでは、
メモリを大量消費の上、速度もコード量の割に遅い
[foldで150バイト風]
[byte[]]$crlf = @(13,10)
gc fixed150.txt -encoding byte -readcount 150 -totalcount (150*200) |%{$_ + $crlf} | sc out_Fixed150.txt -encoding byte
[1レコード先頭35バイトを取り出す]
[byte[]]$crlf = @(13,10)
gc fixed150.txt -encoding byte -readcount 150 -totalcount (150*200) |%{$_[0..34] + $crlf} | sc out_Fixed150.txt -encoding byte
<20181207追記END>