Возникли проблемы с пакетным скриптом - PullRequest
1 голос
/ 03 мая 2011

У меня есть пакетный скрипт, который делает вызов с sqlcmd, чтобы вытянуть результаты оператора SELECT в файл с именем temp.txt. В данных есть некоторые иностранные символы, которые требуют от нас использования Unicode, поэтому temp.txt - это Unicode (кодовая страница 65001).

Когда данные находятся в файле temp.txt, скрипт подсчитывает количество строк и добавляет некоторые заголовки. Для этого необходимо создать новый файл (назовем его newfile.txt), добавить заголовки и количество строк, а затем скопировать в каждую строку из temp.txt в newfile.txt.

Все это работает нормально, за исключением того, что в первой строке, скопированной из temp.txt, есть метка порядка байтов в Юникоде; это означает, что первая строка вместо того, чтобы выглядеть так:

1, Custom Page

выглядит так:

1, Custom Page

Я не могу понять это лучший способ справиться с этим.

Если бы я мог сказать sqlcmd дать мне Юникод без спецификации, это было бы прекрасно - попробовал поискать в гугле, не смог бы разобраться.

Если бы я мог выяснить, как написать цикл FOR для пакетного файла, который удаляет первые три символа только первой строки при копировании в temp.txt, я бы попробовал это, но после некоторого поиска в Google и эксперименты я разочарован там.

Для записи соответствующий код выглядит так:

::%1 = sql file to call; %2 = filename to be created; %3 = header for file; %4 = data type row for file
sqlcmd -I -f 65001 -W -k 1 -h -1 -s "," -S servername -d dbname -i %1 -o temp.txt
set counter=0
for /f %%a in (temp.txt) do set /a counter+=1
echo ^^!total rows=%counter% >> %2
echo !str1! >> %2
echo !str2! >> %2
for /F "delims=¶" %%i in (temp.txt) do ( echo %%i >> %2 )

Пожалуйста, помогите мне, я схожу с ума по этой нелепой маленькой проблеме.

1 Ответ

1 голос
/ 03 мая 2011

Вы можете попробовать

chcp 65001

в вашем пакетном скрипте до вызова sqlcmd.Это не было бы полностью интуитивно, но, возможно, это играет роль.

Если все остальное не помогло, получите себе версию bomstrip, и выдолжно быть в открытом виде.

HTH

Обновление

У меня есть «фиксированная» версия для Windows, которая будет открывать стандартный ввод / вывод в двоичном режиме, так что вы 'Вы избежите автоматического преобразования концов строк (sic!):

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

void
usage(char *prog)
{
    fprintf(stderr, "usage: %s\n", prog);
    exit(1);
}

int
main(int argc, char *argv[])
{
    size_t nread;
    char buf[65536];
    char *utf8bom = "\xef\xbb\xbf";

    if (argc > 1)
        usage(argv[0]);

    /*
     * On Windows, we need to use binary mode to read/write non-text archive
     * formats.  Force stdin/stdout into binary mode in case that is what
     * we are using.
     */
#ifdef WIN32
    if (fmt != archNull)
    {
        setmode(fileno(stdout), O_BINARY);
        setmode(fileno(stdin), O_BINARY);
    }
#endif
    nread = fread(buf, 1, strlen(utf8bom), stdin);
    if (nread == 0)
        return 0;
    if (strcmp(buf, utf8bom) != 0)
        fwrite(buf, 1, nread, stdout);
    for (;;) {
        nread = fread(buf, 1, sizeof buf, stdin);
        if (nread < 0)
            exit(1);
        if (nread == 0)
            return 0;
        fwrite(buf, 1, nread, stdout);
    }
    return 0;
}

Теперь вы можете сделать:

> .\bomstrip.exe < withoutbom > test
> md5sum.exe withoutbom test
f9f2e33bb16636f990180fa3fcbc93cb *withoutbom
f9f2e33bb16636f990180fa3fcbc93cb *test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...