|
何行とかで分ける、といったのは秀丸マクロ(JS含む)である程度容易ですが、
「キロバイトで分ける」というのは、少し難しいように思えますね。
(単純にサイズで分割すると、分割したところが文字を構成するバイトの途中だとヤ
バいので)
(ちょっとC++なりC#なり使わないと速度的にも厄介かも)
50万行程度までなら、大きなファイルでも指定の行で分割するのは、
下記の秀丸マクロでいけると思いますね。
(実行した瞬間終わってるくらいほとんど一瞬だと思います)
jsmode "WebView2";
js {
try {
// ファイル名無しは対象にしない
if (!hidemaru.getFileFullPath()) {
throw "ファイル名が付いているファイルのみ対象とします。";
}
function getPerChunk() {
let answer = input("何行で分けますか?");
let linesPerChunk = 5000;
try {
linesPerChunk = Number(answer);
} catch (err) { }
return linesPerChunk;
}
// 対象のテキストを該当の行数で割って配列にして返す
function splitText(text, linesPerChunk) {
const chunks = [];
const textArray = text.split('\n');
for (let i = 0; i < textArray.length; i += linesPerChunk) {
chunks.push(textArray.slice(i, i + linesPerChunk).join('\n'));
}
return chunks;
}
function getFilePathInfo(filePath) {
// '.' でファイル名を拡張子とそれ以外に分割して配列に格納
var parts = filePath.split('.');
// 拡張子とそれ以外を別々の変数に格納
var ext = parts.pop(); // 拡張子
var name = parts.join('.'); // 拡張子以外の部分
return {
name: name,
ext: ext
};
}
function saveChunksToFiles(chunks) {
let cp = codepage();
let hasbom = bom();
function getTargetEncode() {
switch (cp) {
case 932: return "sjis";
case 1200: return "utf16";
case 65001: return hasbom ? "utf8bom" : "utf8";
}
return "utf8";
}
let fname = hidemaru.getFileFullPath();
let maxFormatLength = chunks.length.toString().length;
for (let i = 0; i < chunks.length; i++) {
let pathAttr = getFilePathInfo(fname);
// 配列の個数を文字列化したその文字列の長さに足りない部分を0埋め
すればよい。
// 配列の個数が30個なら、"30"という文字列の長さ、すなわち2文字。
// 現在の数値が3なら3を文字列化して足りない文字数すなわち1つが0
で埋まる
const zeroFormatNumber = (i + 1).toString().padStart(maxFormatLe
ngth, '0');
// ファイル名を新たに分割したファイル名に
let newFileName = `${pathAttr.name}_${zeroFormatNumber}.${pathAt
tr.ext}`;
hidemaru.saveTextFile(newFileName, chunks[i], getTargetEncode());
}
}
function main() {
// 何行に分割するかを得る
let linesPerChunk = getPerChunk();
// 現在のテキストを取得
const text = hidemaru.getTotalText();
// テキストを分割して配列に格納
const chunks = splitText(text, linesPerChunk);
// 分割したテキストを分割してファイルに保存
saveChunksToFiles(chunks);
}
main();
} catch (err) {
let dll = loaddll("HmOutputPane.dll");
dll.dllFunc.Output(hidemaru.getCurrentWindowHandle(), err + "\r\n");
}
} // js
|
|