Каков наилучший способ сделать dos2unix в файле размером 500 тысяч строк в Windows?[закрыто]

StackOverflow https://stackoverflow.com/questions/313178

  •  10-07-2019
  •  | 
  •  

Вопрос

Вопрос говорит сам за себя, у меня есть файл в 500 000 строк, который генерируется как часть автоматизированного процесса сборки в окне Windows, и он пронизан с.Когда он выходит за дверь, ему нужно *никс дружелюбный, какой здесь наилучший подход, есть ли удобный фрагмент кода, который мог бы сделать это за меня?Или мне нужно написать небольшое приложение на C # или Java?

Это было полезно?

Решение

Здесь приведен однострочный текст Perl, взятый из http://www.technocage.com / ~ Каски / dos2unix /

#!/usr/bin/perl -pi
s/\r\n/\n/;

Вы можете запустить его следующим образом:

perl dos2unix.pl < file.dos > file.unix

Или вы также можете запустить его таким образом (преобразование выполняется на месте):

perl -pi dos2unix.pl file.dos

А вот моя (наивная) версия C:

#include <stdio.h>

int main(void)
{
   int c;
   while( (c = fgetc(stdin)) != EOF )
      if(c != '\r')
         fputc(c, stdout);
   return 0;
}

Вы должны запустить его с перенаправлением ввода и вывода:

dos2unix.exe < file.dos > file.unix

Другие советы

Если установка базы cygwin слишком тяжелая, существует несколько автономных dos2unix и unix2dos Автономные консольные программы для Windows в сети, многие с исходным кодом C / C ++. Если я правильно понимаю требование, любое из этих решений будет вписываться в сценарий автоматической сборки.

Если вы работаете в Windows и вам нужно что-то запустить в пакетном скрипте, вы можете скомпилировать простую программу на языке Си, чтобы выполнить этот трюк.

#include <stdio.h>

int main() {
    while(1) {
        int c = fgetc(stdin);

        if(c == EOF)
            break;

        if(c == '\r')
            continue;

        fputc(c, stdout);
    }

    return 0;
}

Использование:

myprogram.exe < input > output

Редактирование на месте было бы немного сложнее.Кроме того, по какой-то причине вы можете захотеть сохранить резервные копии оригиналов (например, на случай, если вы случайно удалите двоичный файл).

Эта версия удаляет ВСЕ Символы CR;если вы хотите удалить только те, которые находятся в паре CR-LF, вы можете использовать (это классический метод возврата на один символ :-):

/* XXX Contains a bug -- see comments XXX */

#include <stdio.h>

int main() {
    int lastc = EOF;
    int c;
    while ((c = fgetc(stdin)) != EOF) {
        if ((lastc != '\r') || (c != '\n')) {
            fputc (lastc, stdout);
        }
        lastc = c;
    }
    fputc (lastc, stdout);
    return 0;
}

Вы можете отредактировать файл на месте, используя режим "r +".Ниже приведена общая программа myd2u, которая принимает имена файлов в качестве аргументов.ПРИМЕЧАНИЕ:Эта программа использует ftruncate для удаления лишних символов в конце.Если есть какой-либо лучший (стандартный) способ сделать это, пожалуйста, отредактируйте или прокомментируйте.Спасибо!

#include <stdio.h>

int main(int argc, char **argv) {
    FILE *file;

    if(argc < 2) {
        fprintf(stderr, "Usage: myd2u <files>\n");
        return 1;
    }

    file = fopen(argv[1], "rb+");

    if(!file) {
        perror("");
        return 2;
    }

    long readPos = 0, writePos = 0;
    int lastC = EOF;

    while(1) {
        fseek(file, readPos, SEEK_SET);
        int c = fgetc(file);
        readPos = ftell(file);  /* For good measure. */

        if(c == EOF)
            break;

        if(c == '\n' && lastC == '\r') {
            /* Move back so we override the \r with the \n. */
            --writePos;
        }

        fseek(file, writePos, SEEK_SET);
        fputc(c, file);
        writePos = ftell(file);

        lastC = c;
    }

    ftruncate(fileno(file), writePos); /* Not in C89/C99/ANSI! */

    fclose(file);

    /* 'cus I'm too lazy to make a loop. */
    if(argc > 2)
        main(argc - 1, argv - 1);

    return 0;
}
tr -d '^M' < infile > outfile

Вы напечатаете ^ M как: ctrl + V, Enter

Изменить . Вы можете использовать '\ r' вместо ручного ввода возврата каретки, [ благодаря @strager ]

tr -d '\r' < infile > outfile

Редактировать 2 : 'tr' - это утилита для Unix, вы можете загрузить собственную версию Windows с http://unxutils.sourceforge.net [ благодаря @Rob Kennedy ] или используйте эмуляция unix cygwin .

Перенесите его из поля dos в поле unix как файл ascii вместо двоичного файла. Ftp лишит crlf и вставит lf . Перенесите его обратно в поле dos в виде двоичного файла, и lf будет сохранен.

Некоторые текстовые редакторы, такие как UltraEdit / UEStudio имеют эту встроенную функцию.

Файл > Конверсии > DOS в UNIX

Если это всего лишь один файл, я использую notepad ++. Хорошо, потому что это бесплатно. Я установил Cygwin и использую сценарий с одним вкладышем, который я написал для нескольких файлов. Если ваш интерес к сценарию оставьте комментарий. (У меня нет этого в данный момент для меня.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top