Автор Тема: csv-файл в массив с помощью регулярного выражения  (Прочитано 5252 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ildar [?]

  • Осваивающий
  • **
  • Сообщений: 244
  • Репутация: 28
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.8.1
Есть csv-файл, вот кусок содержимого:CO-DIANA,co-vm02.co.essen,"DIGITAL ANALYTICS PRO – аналитическая OLAP-система",PoweredOn,2,4,170, 172.16.10.173,,VM02_store0
CO-DIRECTUM,co-vm05.co.essen,"co-directum - тестовый",PoweredOn,4,24,190, 172.16.10.96,Гилазов Фанис,SinelogyB_02 VM-SAN4
CO-DIRECTUM01,co-vm06.co.essen,"co-directum01 - рабочий",PoweredOn,8,12,290, 172.16.10.97,Гилазов Фанис,SinelogyB_02 VM-SAN4
CO-DIRECTUM-CA,co-vm07.co.essen,"Образ Windows 2012 для серверов VB, DC, Service",PoweredOn,2,4,40, 172.16.10.102,Гилазов Фанис,Database 1 (RAID 10)
CO-DM_Storage,co-vm05.co.essen,"Голова для хранилища ДМ",PoweredOn,4,8,3824, 172.16.10.75,Нестерова Наталья,VM-SAN1 VM-SAN4 DM_Storage-2(Synology814)
CO-EDO-OPTOVIK,co-vm08.co.essen,"Этлас",PoweredOn,2,4,100, 172.16.10.131,Чернов Андрей,SinelogyB_01
надеялся с помощью такого кода
(нажмите для показа/скрытия)
Разделяя строки через разделитель (запятая), но оказалось что текст содержит подобные строкиCO-DIRECTUM-CA,co-vm07.co.essen,"Образ Windows 2012 для серверов VB, DC, Service",PoweredOn,2,4,40, 172.16.10.102,Гилазов Фанис,Database 1 (RAID 10)где кусок "Образ Windows 2012 для серверов VB, DC, Service" сбивает весь порядок. Думаю можно занести текст в массив с помощью регулярного выражения, но ничего в голову не приходит. Какую я вижу тут закономерность? Часть текста в которой не нужно рассматривать запятые в качестве разделителя, выделена в кавычки. В других местах файла (файл большой), кавычки не используются. на примере этой строки что должно получится:
Код: AutoIt [Выделить]
$aArrayLine = ('CO-DIRECTUM-CA', 'co-vm07.co.essen', '"Образ Windows 2012 для серверов VB, DC, Service"', 'PoweredOn', '2', '4', '40', '172.16.10.102', 'Гилазов Фанис', 'Database 1 (RAID 10)')

С регулярными выражениями работал, но эта задача мне оказалась не под силу. Надеюсь на Вашу помощь.
Спасибо!

Русское сообщество AutoIt

csv-файл в массив с помощью регулярного выражения
« Отправлен: Декабрь 13, 2014, 19:31:09 »

Оффлайн edyapd [?]

  • Осваивающий
  • **
  • Сообщений: 380
  • Репутация: 30
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
Dim  $aArrayOUT[6][10]
$File = FileOpen("test.txt")
$j = 0
$pattern = '(?(?=")(".*?")|[^,]+)'
        While 1
            $sLine = FileReadLine($File)
            If @error = -1 Then ExitLoop    
            $aArrayLine = StringRegExp($sLine, $pattern, 3)        
            For $i = 0 to UBound($aArrayLine) - 1
                $aArrayOUT[$j][$i] = $aArrayLine[$i]
            Next
            $j += 1        
        WEnd
FileClose($File)

_ArrayDisplay($aArrayOUT)

« Последнее редактирование: Декабрь 13, 2014, 22:59:30 от edyapd »

Помечен как лучший ответ пользователем ildar Отправлен Декабрь 14, 2014, 07:13:00

Оффлайн sngr [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 882
  • Репутация: 357
    • Награды
  • Версия AutoIt: 3.3.8.1
Код: AutoIt [Выделить]
StringRegExp($file,'(?m)(?<=^|,)(?:"[^"\r\n]*+"|[^,"\r\n])*+',3)


Оффлайн ildar [?]

  • Осваивающий
  • **
  • Сообщений: 244

  • Автор темы
  • Репутация: 28
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.8.1
edyapd
Хорошее решение, но после обработки всего файла я увидел в содержимом пустые места, то есть две запятых подряд. Например:CO-ATS,192.168.200.56,"Asterisk",PoweredOn,1,4,140, 192.168.10.137,,001Ваш вариант их пропустил и произошло смещение. Понятно что Вы не могли это учесть, поскольку в выложенном куске их нет.
sngr
Спасибо, отличная работа.
Вот что получилось
(нажмите для показа/скрытия)
Собственно, все это задумано для перевода csv в xls, с последующим форматированием столбцов. С дальнейшим я справлюсь. edyapd, sngr еще раз спасибо!

Русское сообщество AutoIt

Re: csv-файл в массив с помощью регулярного выражения
« Ответ #3 Отправлен: Декабрь 14, 2014, 07:27:36 »

Оффлайн sngr [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 882
  • Репутация: 357
    • Награды
  • Версия AutoIt: 3.3.8.1
Код: AutoIt [Выделить]
#include 'array.au3'
$file=FileRead('test.txt')
$str=StringRegExp($file,'(?m)(?<=^|,)(?:"[^"\r\n]*+"|[^,"\r\n])*+',3)
_ArrayDisplay($str)

Вот всё что нужно. Никакой нужды читать файл построчно нет.

Оффлайн edyapd [?]

  • Осваивающий
  • **
  • Сообщений: 380
  • Репутация: 30
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
$str=StringRegExp($file,'(?m)(?<=^|,)(?:"[^"\r\n]*+"|[^,"\r\n])*+',3)

Вот всё что нужно. Никакой нужды читать файл построчно нет.
Если бы вы ещё расшифровали, то был бы очень признателен.
Просто я совсем недавно пытаюсь составлять выражения. То что написано у меня, там понятно новичку.
В вашем выражении я дальше второй группы продвинуться не смог.

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
ildar,
Можно примерно так сделать.
(нажмите для показа/скрытия)
Поправил код, предыдущий вариант у меня работал в AutoIt v3.3.8.1 и не работал в AutoIt v3.3.12.0  :think:
« Последнее редактирование: Декабрь 14, 2014, 17:46:41 от madmasles »


Русское сообщество AutoIt

Re: csv-файл в массив с помощью регулярного выражения
« Ответ #7 Отправлен: Декабрь 14, 2014, 09:37:22 »

Оффлайн ildar [?]

  • Осваивающий
  • **
  • Сообщений: 244

  • Автор темы
  • Репутация: 28
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.8.1
Код: AutoIt [Выделить]
#include 'array.au3'
$file=FileRead('test.txt')
$str=StringRegExp($file,'(?m)(?<=^|,)(?:"[^"\r\n]*+"|[^,"\r\n])*+',3)
_ArrayDisplay($str)

Вот всё что нужно. Никакой нужды читать файл построчно нет.
Мне нужен двумерный массив, по этому читаю построчно.

Оффлайн edyapd [?]

  • Осваивающий
  • **
  • Сообщений: 380
  • Репутация: 30
    • Награды
  • Версия AutoIt: 3.3.14.0
Вот всё что нужно. Никакой нужды читать файл построчно нет.
Мне нужен двумерный массив, по этому читаю построчно.
А вы всё таки попробуйте.
Хотя признаться я с ходу ещё не разобрался как это работает. Жду, может автор расшифрует.

Оффлайн AleXXX34 [?]

  • Новичок
  • *
  • Сообщений: 1
  • Репутация: 0
    • Награды
можно так в двумерный массив:
Код: AutoIt [Выделить]
#include <String.au3>
#include <Array.au3>


Dim $box[2000][20]  ;двумерный массив ячеек, 2000 строк, 20 столбцов
Dim $ya[20]                          
Dim $aRecords
_FileReadToArray("test.txt",$aRecords)
    For $XkolX = 1 to $aRecords[0]
    Next
; разделяем строки по ячейкам
For $ia = 1 To $aRecords[0]                            
    $ya = StringSplit ($aRecords[$ia], "," )    ; ставим разделитель, если TAB то @TAB, если запятая то "," и тд и тп
    $nya = $ya[0]
For $k = 1 To $nya
    $box[$ia][$k] = $ya [$k]
Next
Next
_ArrayDisplay($box)]
 

« Последнее редактирование: Июль 16, 2015, 18:07:43 от AleXXX34 »

Оффлайн alex33 [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1419
  • Репутация: 177
  • Пол: Мужской
    • alekssamos ВКонтакте
    • Награды
  • Версия AutoIt: 3.3.12.0
Плохо что в AutoIt нет таких же функций, как в PHP (fgetcsv и fputcsv или str_getcsv)... :( :(

Русское сообщество AutoIt

Re: csv-файл в массив с помощью регулярного выражения
« Ответ #11 Отправлен: Июль 16, 2015, 16:11:01 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
5 Ответов
5826 Просмотров
Последний ответ Апрель 07, 2010, 21:22:36
от CreatoR
1 Ответов
2819 Просмотров
Последний ответ Декабрь 30, 2011, 19:27:41
от madmasles
0 Ответов
2003 Просмотров
Последний ответ Декабрь 30, 2011, 22:37:28
от Kaster
6 Ответов
3293 Просмотров
Последний ответ Октябрь 25, 2013, 20:38:36
от C2H5OH
19 Ответов
5337 Просмотров
Последний ответ Февраль 26, 2015, 22:11:44
от AZJIO
9 Ответов
3150 Просмотров
Последний ответ Январь 06, 2016, 18:11:32
от Kasper
4 Ответов
2999 Просмотров
Последний ответ Март 08, 2017, 12:02:03
от Garrett
6 Ответов
4198 Просмотров
Последний ответ Апрель 18, 2017, 01:34:24
от CreatoR
3 Ответов
318 Просмотров
Последний ответ Апрель 29, 2018, 11:05:47
от edyapd
12 Ответов
606 Просмотров
Последний ответ Июль 29, 2018, 11:47:33
от Alofa