2016-08-08 7 views
0

Я ищу для создания пакетного файла/макроса для удаления первой строки автоматически сгенерированного CSV UTF-8 и преобразования его в кодовую страницу Windows 1251 ("ANSI"). Я искал по всему интернету и пробовал много вещей, но просто не могу найти тот, который работает ...csv-файл UTF-8 (с BOM) в ANSI/Windows-1251

Удаление первой линии достаточно

@echo off 
set "csv=test.csv" 
more +1 "%csv%" >"%csv%.new" 
move /y "%csv%.new" "export\%csv%" >nul 

просто после этого я «м потерял, Ive пытался с помощью заданного типа из DOS

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 

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) 

Это, однако, также не сработало.

EDIT 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 без спецификации.

Итак, теперь мне нужно только сценарий для первой строки без изменения кодировки.

+2

Название «ANSI», хотя это обычно используется, является неточным. Вероятно, это относится к одной из 8-битных кодовых страниц, используемых в Microsoft Windows, возможно, Windows-1252. Если вы конвертируете UTF-8 в Windows-1252, вы можете запускать символы, которые невозможно преобразовать. https: //en.wikipedia.org/wiki/Windows-1252 –

+0

Да, нам нужны файлы, которые будут в W-1251. Мы уже заполнили систему таким образом, чтобы эти неконвертируемые символы не использовались. факт остается, система генерирует utf-8 .csv, а система, которую мы хотим импортировать, требует ANSI .csv без заголовков. –

+0

. Вы должны обновить вопрос, чтобы указать Windows-1251. –

ответ

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 ελληνικά (Ελλάδα) 

Выход показывает, что те символы, которые не могут быть b e, преобразованные в конкретный набор символов, преобразуются с использованием Character Decomposition Mapping (č =>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  ελληνικά (Ελλάδα)