Исправление сломанного CSV с окончаниями строки Windows - PullRequest
0 голосов
/ 08 октября 2019

У меня есть CSV, который выглядит следующим образом:

25/04/2017,23:35:59,unknown,+123456789,Photo Message
25/04/2017,23:36:09,unknown,+123456789,Сириус конторка
25/04/2017,23:36:15,unknown,+123456789,Главный из офис
26/04/2017,08:15:55,unknown,+123456789,Напишіть будь ласка номер Житло-Капітал, за яким повідомляють:
- суму коштів до повернення/доплати
- комісію за управління інвестиційними коштами
26/04/2017,08:17:44,unknown,+123456789,374-03-08
26/04/2017,08:29:24,unknown,+123456789,Для тех, кто не был на собрании. Вчера мы:

1. Собрали контакты (фио + № квартиры + телефон) тех жильцов, которые пресутствовали на собрании.
2. Подписали заявление по счётчикам тепла.
3. Подписали заявление "щодо недоліків".
4. Коллективное обращение по договорах коммуналки.
5. Инициативная группа рассказала про текущий ход переговоров с жеком по поводу договоров.

Что дальше: 
1. Ждём результатов переговоров инициативной группы с жеком. Она должна состояться сегодня.
2. Когда будут готовы согласованные с жеком договора, они будут выложены здесь и на форумах, чтобы каждый мог себе их распечатать, и сравнить с тем, что жек даст на подпись при подписании акта.
2. Кто не подписал заявления/обращения, сможет это сделать до четверга. Где их можно будет подписать - позже узнаем.
26/04/2017,08:29:53,unknown,+123456789,Колективне звернення по договорах комуналки.pdf
26/04/2017,08:29:54,unknown,+123456789,Лист щодо недоліків Забудовнику та Управителю.pdf
26/04/2017,08:29:54,unknown,+123456789,Лічильники тепла - Акцепт.pdf

У него есть несколько проблем:

  1. окончания строки ^M символа (см. " Что делаетЗначения ^ M означают в Vim?"),
  2. последний 5-й столбец содержит многострочные строки,
  3. последний 5-й столбец не экранирован должным образом, например, это тот, в котором сидит голая комавокруг.

Что я точно знаю:

  1. CSV имеет 5 столбцов,
  2. конец строки всегда ^M (например, это Windowsкодирование конца строки).

Как из этого сделать правильный CSV?

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

На всякий случай, если вам нужна функция, которая может удалить конец строки Windows:

" dos2unix ^M
if !exists('*Dos2unixFunction')
    fun! Dos2unixFunction() abort
        "call Preserve('%s/ $//ge')
        call Preserve(":%s/\x0D$//e")
        set ff=unix
        set bomb
        set encoding=utf-8
        set fileencoding=utf-8
    endfun
endif
com! Dos2Unix :call Dos2unixFunction()
cnoreabbrev dos2unix Dos2unix
cnoreabbrev d2u Dos2Unix

" This function can be called to save your cursor position
if !exists('*Preserve')
    function! Preserve(command)
        try
            let l:win_view = winsaveview()
             "silent! keepjumps keeppatterns execute a:command
            silent! execute 'keeppatterns keepjumps ' . a:command
        finally
            call winrestview(l:win_view)
        endtry
    endfunction
endif
0 голосов
/ 08 октября 2019

Я думаю, что слишком остро отреагировал на сложность этого. Следующий код в Elixir разбивает файл CSV на правильный список списков:

File.read!("sample.csv")
|> String.split("\r\n")
|> Enum.map(&String.split(&1, ",", parts: 5))

Результат:

[
  ["25/04/2017", "23:36:09", "unknown", "+123456789",
   "Сириус конторка"],
  ["25/04/2017", "23:36:15", "unknown", "+123456789",
   "Главный из офис"],
  ["26/04/2017", "08:15:55", "unknown", "+123456789",
   "Напишіть будь ласка номер Житло-Капітал, за яким повідомляють:\n- суму коштів до повернення/доплати\n- комісію за управління інвестиційними коштами"],
  ["26/04/2017", "08:17:44", "unknown", "+123456789", "374-03-08"],
  ["26/04/2017", "08:29:24", "unknown", "+123456789",
   "Для тех, кто не был на собрании. Вчера мы:\n\n1. Собрали контакты (фио + № квартиры + телефон) тех жильцов, которые пресутствовали на собрании.\n2. Подписали заявление по счётчикам тепла.\n3. Подписали заявление \"щодо недоліків\".\n4. Коллективное обращение по договорах коммуналки.\n5. Инициативная группа рассказала про текущий ход переговоров с жеком по поводу договоров.\n\nЧто дальше: \n1. Ждём результатов переговоров инициативной группы с жеком. Она должна состояться сегодня.\n2. Когда будут готовы согласованные с жеком договора, они будут выложены здесь и на форумах, чтобы каждый мог себе их распечатать, и сравнить с тем, что жек даст на подпись при подписании акта.\n2. Кто не подписал заявления/обращения, сможет это сделать до четверга. Где их можно будет подписать - позже узнаем."],
  ["26/04/2017", "08:29:53", "unknown", "+123456789",
   "Колективне звернення по договорах комуналки.pdf"],
  ["26/04/2017", "08:29:54", "unknown", "+123456789",
   "Лист щодо недоліків Забудовнику та Управителю.pdf"],
  ["26/04/2017", "08:29:54", "unknown", "+123456789",
   "Лічильники тепла - Акцепт.pdf"],
  [""]
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...