Итак, я создал пакетный скрипт, который выводит некоторый текст в CSV. Когда я открываю CSV в блокноте, это выглядит так, как я хочу.

173030,8,2793,2821244
173032,1,2793,2820692
173033,1,2793,2821120
173035,2,2793,2820788

Однако в Excel это выглядит так:

173030   8
2793
2821244

173032   1
2793
2820692

173033   1
2793
2821120

173035   2
2793
2820788

Дело в том, что есть некоторые нежелательные разрывы строк. Кажется, что Блокнот распознает только разрыв строки CRLF, но есть некоторые другие разрывы строк, которые являются либо CR, либо LF, которые Excel видит, а Блокнот не видит. Какой лучший способ позаботиться об этом? Поскольку я уже создаю его с помощью Batch-скрипта, было бы лучше, если бы была Batch-команда, которая могла бы удалить нежелательные разрывы строк. Но если есть настройки Excel или что-то, что я могу изменить, это тоже может сработать.

2 ответа2

1

Если ваш пример точен, вы, возможно, не создаете что-то, что Excel действительно может иметь смысл. Я бы порекомендовал попробовать поставить строку, содержащую заголовки, в качестве первой строки, чтобы посмотреть, поможет ли это.

Также проверьте окончания строк, чтобы убедиться, что вы добавляете \r \n (например, окончания строк Windows), а не просто \n - Excel должен справиться с последним, но это может быть трудно узнать.

Наконец, убедитесь, что ваш пакетный вывод не содержит ложных символов. Например, вы уверены, что числа не имеют начальных или конечных символов, таких как двоичный код <32?

ОБНОВИТЬ:

Хорошо, этот файл, которым вы поделились, не является действительным CSV. Вы должны убрать нечетные символы. Я только что открыл его в текстовом редакторе Скобки, и строки разделены там. Вот почему Excel делает то же самое.

Например, в первой строке после числа 8 у вас есть 13 пробелов, за которыми следует возврат каретки (\n)

ОБНОВЛЕНИЕ 2: Опции для очистки вывода. Вот несколько возможностей, которые вы можете выбрать в зависимости от ваших знаний, опыта и разрешенных возможностей на рабочем столе:

  • PowerShell - вы можете использовать функции PS, чтобы довольно легко очистить данные и вывести их в действительный CSV (PS имеет встроенные возможности CSV). Это может означать изучение PS конечно.
  • Узел.JS - мой любимый инструмент для всех платформ! Кроссплатформенный хост JavaScript, который позволяет запускать процессы как командной строки, так и "сервера". Он имеет хороший доступ к собственной файловой системе и имеет обширные массивы библиотек для выполнения практически всех задач. Отлично, если вы уже знаете JavaScript из веб-разработки или хотите свести к минимуму количество языков, с которыми вам приходится иметь дело. Также вы можете использовать node-webkit для создания кроссплатформенных интерфейсов с мощью Node.
  • Windows Scripting Host - также способен запускать JavaScript (ну, во всяком случае, JScript, который близок). Вы также можете использовать VBScript, если нужно. Может быть запущен из командной строки, если он не был отключен усердными администраторами. Вы можете использовать тот же код в HTA, если вам нужен пользовательский интерфейс.
  • Google Refine - очень полезный инструмент ETL для очистки и преобразования данных. Немного долго в зубе сейчас и редко обновляется, но это работает. Свободно.
  • Excel PowerQuery - надстройка от Microsoft, которая чрезвычайно полезна для ETL, если L - это Excel! Я использую это все время сейчас. Бесплатно, часть инструментов Microsoft BI.

Конечно, есть много других, это лишь несколько примеров.

0

Редактировать поведение управления необходимо для LF (в отличие от RTF и языков программирования). Если LF предшествует CR, оба удаляются. Хотя CMD будет писать правильные окончания строк, если ваш код не является необычным.

Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
If LCase(Arg(1)) = "cr" then 
    Do Until Inp.AtEndOfStream
        Line=Inp.readline
        Line=Replace(Line, vbcr, "")
        Line=Replace(Line, vblf, "")
        outp.writeline Line
    Loop
End If
If LCase(Arg(1)) = "lf" then 
    Do Until Inp.AtEndOfStream
        Line=Inp.readline
        Line=Replace(Line, vbcr, vbcrlf)
        outp.writeline Line
    Loop
End If

Использовать

Разрывы строк

filter fix {lf|cr}

Исправляет проблемы с окончаниями строк.

Различные программы по-разному относятся к окончанию строки. Кроме того, Блокнот вставляет лишний дополнительный CR, который он игнорирует, но другие программы этого не делают.

Строки разбиты по символу перевода строки. Если предшествует возврат каретки, оба удаляются. Однако один возврат каретки без перевода строки не прерывает ее.

cr - removes all stray CR and LF left on each line.
lf - add a LF to any CR embeded in the middle of the line.

пример

Исправляет win.ini, не то что нужно исправлять, и отправляет его на экран

cscript //nologo filter.vbs fix cr < "%systemroot%\win.ini"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .