CSV-файл UTF-8 (с спецификацией) в ANSI / Windows-1251
Я ищу, чтобы создать пакетный файл / макрос, чтобы удалить первую строку автоматически сгенерированного UTF-8 CSV и преобразовать его в кодовую страницу Windows 1251 ("ANSI"). Я искал по всему интернету и перепробовал много вещей, но просто не могу найти тот, который работает...
Удаление первой строки достаточно просто
@echo off
set "csv=test.csv"
more +1 "%csv%" >"%csv%.new"
move /y "%csv%.new" "export\%csv%" >nul
после этого я потерял, я попытался использовать набор TYPE из DOS
cmd /a /c TYPE test.csv > ansi.csv
и много вариантов этого, но он либо возвращает пустой файл CP1251, либо просто другой файл UTF.
Я пытался использовать VBS, но это вернуло другой файл UTF-8, но теперь без спецификации
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
EDIT1: попытался преобразовать в ISO-8859-1 вместо CP1251 с помощью VBS
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: я нашел способ конвертировать файлы из UTF в ANSI с помощью stringconverter.exe (загружается с 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
Однако теперь, когда я удаляю первую строку файла (до или после, не имеет значения), он снова становится UTF-8 без спецификации.
Поэтому все, что мне сейчас нужно, это скрипт для удаления первой строки без изменения кодировки.
1 ответ
Следующий VBScript может помочь: процедура UTF8toANSI
преобразует UTF-8
закодированный текстовый файл в другую кодировку.
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, ByVal ANSICharSet)
Dim strText
With CreateObject("ADODB.Stream")
.Type = adTypeText
.Charset = "utf-8"
.Open
.LoadFromFile UTF8FName
strText = .ReadText(adReadAll)
.Close
.Charset = ANSICharSet
.Open
.WriteText strText, adWriteChar
.SaveToFile ANSIFName, adSaveCreateOverWrite
.Close
End With
End Sub
'UTF8toANSI WScript.Arguments(0), WScript.Arguments(1)
UTF8toANSI "D:\test\SO\38835837utf8.csv", "D:\test\SO\38835837ansi1250.csv", "windows-1250"
UTF8toANSI "D:\test\SO\38835837utf8.csv", "D:\test\SO\38835837ansi1251.csv", "windows-1251"
UTF8toANSI "D:\test\SO\38835837utf8.csv", "D:\test\SO\38835837ansi1253.csv", "windows-1253"
Список имен наборов символов, известных системе, см. В подразделах HKEY_CLASSES_ROOT\MIME\Database\Charset
в реестре Windows:
for /F "tokens=5* delims=\" %# in ('reg query HKCR\MIME\Database\Charset') do @echo "%#"
Данные (38835837utf8.csv
файл):
1st Line 1250 852 čeština (Čechie)
2nd Line 1251 966 русский (Россия)
3rd Line 1253 737 ελληνικά (Ελλάδα)
Вывод показывает, что те символы, которые не могут быть преобразованы в конкретный набор символов, преобразуются с использованием сопоставления разложения символов (č
=>c
, š
=>s
, Č
=>C
так далее.); если не применимо, то все они преобразуются в ?
знак вопроса (общий символ замены):
==> chcp 1250
Active code page: 1250
==> type D:\test\SO\38835837ansi1250.csv
1st Line 1250 852 čeština (Čechie)
2nd Line 1251 966 ??????? (??????)
3rd Line 1253 737 ???????? (??????)
==> chcp 1251
Active code page: 1251
==> type D:\test\SO\38835837ansi1251.csv
1st Line 1250 852 cestina (Cechie)
2nd Line 1251 966 русский (Россия)
3rd Line 1253 737 ???????? (??????)
==> chcp 1253
Active code page: 1253
==> type D:\test\SO\38835837ansi1253.csv
1st Line 1250 852 cestina (Cechie)
2nd Line 1251 966 ??????? (??????)
3rd Line 1253 737 ελληνικά (Ελλάδα)