Удаление разрывов строк из CSV для правильного импорта Excel

Итак, я создал пакетный скрипт, который выводит текст в 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 видит, что Блокнот не делает. Какой лучший способ позаботиться о это? Поскольку я уже создаю его с помощью пакетного сценария, было бы лучше, если бы была пакетная команда, которая могла бы удалить нежелательные разрывы строк. Но если есть настройки excel или что-то, что я могу изменить, это тоже может сработать.

13
задан Michael
07.03.2023 22:54 Количество просмотров материала 2824
Распечатать страницу

2 ответа

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

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

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

обновление:

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

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

обновление 2: Варианты для очищать вверх выход. Вот несколько возможностей, которые вы можете выбрать в зависимости от ваших знаний, фона и разрешенных возможностей на рабочем столе:

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

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

1
отвечен Julian Knight 2023-03-09 06:42

изменить поведение управления сломать на 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

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

LineBreaks

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"
0
отвечен trigger 2023-03-09 08:59

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх