ようやくできた。しかし適当なつくりである。
#記事間のセパレータ
$sep_post = "--------";
$sep = "-----";
#コンテンツの内容を加工する関数
function convert_content([ref]$c)
{
$p = 0;
$pres = @();
## Preタグの内部は加工されないように$pres配列に格納しておく
while($m = Select-String -InputObject $c.value -Pattern "<pre>[\S\s]*?</pre>" )
{
#<pre>タグの内部を配列に格納
$pres += $m.Matches[0];
#代わりにridという属性をつけて<pre>タグを置き換える。
$c.value = $c.value.SubString(0,$m.Matches[0].Index) + "<pre rid=`"$p`"/>" + $c.value.SubString($m.Matches[0].Index + $m.Matches[0].Length,$c.value.Length - $m.Matches[0].Index - $m.Matches[0].Length);
$p++;
}
#改行を<br/>に置換する
$c.value = $c.value -ireplace "`r`n" ,"<br/>`r`n";
#連続した<br/>を1つにまとめる
$c.value = $c.value -ireplace "<br/><br/>","<br/>";
#連続した<br/>は<p>に変換するのはヤメた。
# if($c.value -imatch "\<br\/\>`r`n\<br\/\>")
# {
# $c.value = $c.value -ireplace "\<br\/\>`r`n\<br\/\>","</p><p>";
# $c.value = "<p>" + $c.value + "</p>";
# #空の<p></p>を取る
# $c.value = $c.value -ireplace "\<p\>\r\n\<\/p\>","";
# }
# 余分な<br/>を消す。
$c.value = $c.value -ireplace "<br/>\r\n(</?p>)","`r`n`$1";
$c.value = $c.value -ireplace "(</p>)(\r\n)?<br/>","`$1";
$c.value = $c.value -ireplace "(</?[duo][tl]>)<br/>","`$1";
$c.value = $c.value -ireplace "(</?t[hdr]>)<br/>","`$1";
$c.value = $c.value -ireplace "(</?table>)<br/>","`$1";
$c.value = $c.value -ireplace "(</li>)<br/>","`$1";
$c.value = $c.value -ireplace "http://sfpg.up.seesaa.net/image/","https://www.sfpgmr.net/images/";
$c.value = $c.value -ireplace "-thumbnail2","";
$c.value = $c.value -ireplace "(\<pre[\S\s]*?/>)\<br\/\>","`$1"
$c.value = $c.value -ireplace "(\<blockquote[\s\S]*?>)\<br\/\>","`$1"
$c.value = $c.value -ireplace "(\</blockquote>)\<br\/\>","`$1"
#<pre>の中身を元に戻す。
for($i = 0; $i -lt $pres.Length;++$i)
{
$c.value = $c.value -ireplace ("<pre rid=`"" + $i + "`"/>"),($pres[$i] );
}
}
$wdir = "c:\hoge\"
#出力ファイルを開く
$writer = New-Object IO.StreamWriter(($dir + "out.log"),$false,[Text.Encoding]::GetEncoding("utf-8"));
#ディレクトリ内にあるエキスポートファイルを列挙する
foreach($file in Get-ChildItem(($dir + "mtarchive*.log"))
{
#エキスポートファイルを開く
$reader = New-Object IO.StreamReader($file,[Text.Encoding]::GetEncoding("utf-8"));
while(!$reader.EndOfStream){
$line = $reader.ReadLine();
if($reader.EndOfStream)
{
$reader.Close();
break;
}
#投稿者
$author = "";
if($line -like "AUTHOR:*")
{
$author = ($line -ireplace "S.F.","sfpgmr");
}
#タイトル
$title = $reader.ReadLine();
#ステータス
$status = $reader.ReadLine();
#コメントを許可するか
$allow_comments = $reader.ReadLine() -ireplace '\d', '1'
#改行を変換するかどうか
$convert_breaks = $reader.ReadLine();
$convert_body = $convert_breaks -eq "CONVERT BREAKS: 1";
#pingを許可するかどうか
$allow_pings = $reader.ReadLine();
#primary category
$primary_category = $reader.ReadLine();
#category
$category = $reader.ReadLine();
#日付
$date = $reader.ReadLine();
if($reader.ReadLine() -ne $sep){ exit;}
#記事
$body = $reader.ReadLine();
$content = "";
while(($line = $reader.ReadLine()) -ne $sep)
{
$content += $line + "`r`n";
}
#記事の続き
$extended_body = $reader.ReadLine();
$extended_content = "";
while(($line = $reader.ReadLine()) -ne $sep)
{
$extended_content += $line + "`r`n";
}
#要約
$excerpt = $reader.ReadLine();
$excerpt_content = "";
while(($line = $reader.ReadLine()) -ne $sep)
{
$excerpt_content += $line + "`r`n";
}
#キーワード
$keyword = $reader.ReadLine();
$keyword_content = "";
while((!$reader.EndOfStream) -and (($line = $reader.ReadLine()) -ne $sep))
{
$keyword_content += $line + "`r`n";
}
#コメント
$comment ="";
while((!$reader.EndOfStream) -and ($line = $reader.ReadLine()) -ne $sep_post)
{
$comment += $line + "`r`n";
}
if($convert_body) {
convert_content([ref]$content);
}
#出力する
$writer.WriteLine($author);
$writer.WriteLine($title);
$writer.WriteLine($status);
$writer.WriteLine($allow_comments);
$writer.WriteLine($convert_breaks);
# $write.WriteLine $convert_body);
$writer.WriteLine($allow_pings);
$writer.WriteLine($primary_category);
$writer.WriteLine($category);
$writer.WriteLine($date);
$writer.WriteLine($sep);
$writer.WriteLine($body);
$writer.WriteLine(($content + $sep));
$writer.WriteLine($extended_body);
$writer.WriteLine(($extended_content + $sep));
$writer.WriteLine($excerpt);
$writer.WriteLine(($excerpt_content + $sep));
$writer.WriteLine($keyword);
$writer.WriteLine(($keyword_content + $sep));
if($comment.Length -gt 0){
$writer.Write(($comment));
}
$writer.WriteLine($sep_post);
}
$reader.Close();
}
$writer.Close();
このスクリプトで作ったファイルをインポートしてデータの移行はようやく完了した。