You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell Get-Content截取SQL文件后输出更大的原因及解决办法

问题原因与解决方案

核心原因

  • 编码转换是体积暴涨的主因:你的原.sql文件大概率采用UTF-8(无BOM)或ANSI单字节编码,而PowerShell 5.1中,Get-Content读取内容后,通过>、Out-File或Set-Content输出时默认使用**UTF-16LE(Unicode)**编码——这种编码每个字符占用2字节(特殊字符更多),直接让文件体积翻倍甚至更多。即使改为.txt后缀,只要编码问题没解决,体积依然会远大于原文件。
  • 换行符转换的次要影响:原文件可能使用Unix风格的LF换行,PowerShell输出时会自动转为Windows风格的CRLF,每个换行多1字节,但这对整体体积影响极小。

解决办法

1. 匹配原文件编码读取与保存

先确定原文件编码:可以通过Get-Content -Path "你的文件.sql" -Encoding Byte -TotalCount 3查看前3字节判断——UTF-8 BOM是EF BB BF,UTF-16LE是FF FE,无标识则为UTF-8无BOM或ANSI。

  • 若原文件是UTF-8无BOM,执行命令:
    Get-Content -Path "原文件.sql" -Encoding UTF8 | Select-Object -First 10000 | Set-Content -Path "新文件.sql" -Encoding UTF8
    
  • 若为ANSI编码,将-Encoding UTF8替换为-Encoding Default(对应系统默认ANSI编码)。

2. 用.NET类高效处理大文件

对于25GB级别的大文件,直接调用.NET的System.IO.File类更高效,避免PowerShell管道的额外开销,同时严格控制编码:

$source = "原文件.sql"
$target = "新文件.sql"
$keepLines = 10000
$encoding = [System.Text.Encoding]::UTF8 # 根据原文件编码调整,如[System.Text.Encoding]::Default对应ANSI
$selectedLines = [System.IO.File]::ReadLines($source, $encoding) | Select-Object -First $keepLines
[System.IO.File]::WriteAllLines($target, $selectedLines, $encoding)

该方法逐行读取,内存占用低,且完全保留原编码,新文件体积会和原文件同比例缩小(约为原文件的1/3)。

3. 字符串截取法(仅适合小文件,不推荐25GB文件)

若内存足够容纳前1万行内容,可尝试:

$content = Get-Content -Path "原文件.sql" -Encoding UTF8 -Raw
$splitLines = $content -split "`n", ($keepLines + 1)
$newContent = $splitLines -join "`n"
Set-Content -Path "新文件.sql" -Encoding UTF8 -Value $newContent

注意:25GB文件用-Raw会占用大量内存,可能导致PowerShell崩溃,不建议使用。

内容的提问来源于stack exchange,提问作者Yoav24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:46:08