0

I have a CSV that looks like this:

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

It has several problems:

  1. line endings are ^M character (see "What does ^M character mean in Vim?"),
  2. final 5th column contains multiline lines,
  3. final 5th column is not properly escaped, e.g. and it's the one that has bare comas sitting around.

What I know for sure that:

  1. the CSV has 5 columns,
  2. line ending is always ^M (e.g. it's Windows-encoded line-ending).

How can I make a proper CSV out of this one?

oldhomemovie
  • 14,621
  • 13
  • 64
  • 99

2 Answers2

0

I think I overreacted about the complexity of this. The following code in Elixir splits the CSV file into correct list of lists:

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

Result:

[
  ["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"],
  [""]
]
oldhomemovie
  • 14,621
  • 13
  • 64
  • 99
0

Just in case you want a function that can remove Windows end of line:

" 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
SergioAraujo
  • 11,069
  • 3
  • 50
  • 40