【发布时间】:2016-08-08 18:11:02
【问题描述】:
我希望创建一个批处理文件/宏来删除自动生成的 UTF-8 CSV 的第一行并将其转换为 Windows 代码页 1251(“ANSI”)。 我一直在寻找整个互联网并尝试了很多东西,但找不到一个有效的......
删除第一行很简单
@echo off
set "csv=test.csv"
more +1 "%csv%" >"%csv%.new"
move /y "%csv%.new" "export\%csv%" >nul
在我迷路之后,我尝试使用从 DOS 设置的 TYPE
cmd /a /c TYPE test.csv > ansi.csv
还有很多变体,但它要么返回一个空的 CP1251 文件,要么只返回另一个 UTF 文件。
我尝试过使用 vbs,但这返回了另一个 UTF-8 文件,但现在没有 BOM
Option Explicit
Private Const adReadAll = -1
Private Const adSaveCreateOverWrite = 2
Private Const adTypeBinary = 1
Private Const adTypeText = 2
Private Const adWriteChar = 0
Private Sub UTF8toANSI(ByVal UTF8FName, ByVal ANSIFName)
Dim strText
With CreateObject("ADODB.Stream")
.Open
.Type = adTypeBinary
.LoadFromFile UTF8FName
.Type = adTypeText
.Charset = "utf-8"
strText = .ReadText(adReadAll)
.Position = 0
.SetEOS
.Charset = "_autodetect" 'Use current ANSI codepage.
.WriteText strText, adWriteChar
.SaveToFile ANSIFName, adSaveCreateOverWrite
.Close
End With
End Sub
UTF8toANSI "UTF8-wBOM.txt", "ANSI1.txt"
UTF8toANSI "UTF8-noBOM.txt", "ANSI2.txt"
MsgBox "Complete!", vbOKOnly, WScript.ScriptName
编辑1: 尝试使用 vbs 转换为 iso-8859-1 而不是 cp1251
Option Explicit
Private Const adReadAll = -1
Private Const adSaveCreateOverWrite = 2
Private Const adTypeBinary = 1
Private Const adTypeText = 2
Private Const adWriteChar = 0
Private Sub UTF8toANSI(ByVal UTF8FName, ByVal ANSIFName)
Dim strText
With CreateObject("ADODB.Stream")
.Open
.Type = adTypeBinary
.LoadFromFile UTF8FName
.Type = adTypeText
.Charset = "utf-8"
strText = .ReadText(adReadAll)
.Position = 0
.SetEOS
.Charset = "iso-8859-1"
.WriteText strText, adWriteChar
.SaveToFile ANSIFName, adSaveCreateOverWrite
.Close
End With
End Sub
UTF8toANSI WScript.Arguments(0), WScript.Arguments(1)
然而这也不起作用。
编辑 2: 我找到了一种使用 stringconverter.exe 将文件从 UTF 转换为 ANSI 的方法 (从http://www.computerperformance.co.uk/ezine/tools.htm下载)
Setlocal
Set _source=C:\Users\lloyd.EVD\delFirstBat\import
Set _dest=C:\Users\lloyd.EVD\delFirstBat\export
For /F "Tokens=*" %%I In ('dir /b /a-d "%_source%\*.CSV"') Do stringconverter "%_source%\%%~nxI" "%_dest%\%%~nxI" /ANSI
现在当我删除文件的第一行时(无论是之前还是之后,都没有关系),它又变成了没有 BOM 的 UTF-8。
所以我现在只需要一个脚本来删除第一行而不更改字符集。
【问题讨论】:
-
“ANSI”这个名称虽然很常用,但并不准确。它可能指的是 Microsoft Windows 上使用的 8 位代码页之一,可能是 Windows-1252。如果您将 UTF-8 转换为 Windows-1252,您可能会遇到无法转换的字符。 en.wikipedia.org/wiki/Windows-1252
-
是的,我们需要将文件放在 W-1251 中。我们已经以这种方式填写了系统,不应使用这些不可转换的字符。事实上,系统会生成一个 utf-8 .csv,而我们希望将其导入的系统需要一个没有标题的 ANSI .csv
-
您应该更新问题以指定 Windows-1251。
-
如果只是一次性的,请将文件移动到 Unix 系统并执行
sed 1d file | iconv -f utf-8 -t cp1251 >newfile... 如果您有本地系统,您可以ssh到,您甚至不需要将文件物理存储在那里;plink remote 'sed 1d | iconv -f utf-8 -t cp1251' <original.csv >fixed.csv
标签: windows batch-file utf-8 vbscript codepages