Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 11.12.2016, 15:48
Интересующийся
Отправить личное сообщение для SergeyPetrovA Посмотреть профиль Найти все сообщения от SergeyPetrovA
 
Регистрация: 30.08.2015
Сообщений: 14

laimas,
Всё отлично. Чуть поехало, но мне это не мешает. Очень помогли.
Ответить с цитированием
  #12 (permalink)  
Старый 11.12.2016, 15:59
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Что значит "поехало"?
Ответить с цитированием
  #13 (permalink)  
Старый 11.12.2016, 16:09
Интересующийся
Отправить личное сообщение для SergeyPetrovA Посмотреть профиль Найти все сообщения от SergeyPetrovA
 
Регистрация: 30.08.2015
Сообщений: 14

В смысле чуть сместилось sn и createTimestamp, т.к. они встречаются два раза в указанном блоке. Но мне собственно и не особо мне нужны.
Ответить с цитированием
  #14 (permalink)  
Старый 11.12.2016, 16:38
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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

$arr = []; 
//задаем нужную последовательсть заголовков
$keys = ['givenName', 'mail', 'sn', 'telephoneNumber', 'createTimestamp'];
//заголовок csv-файла
$csv[] = implode(';', $keys);

foreach(file('data.txt', FILE_SKIP_EMPTY_LINES ) as $v) {
    if(preg_match('/'.implode('|', $keys).'/', $v)) {
        $v = array_map('trim', explode(':', $v));
        //если поле уже дополнено в массив, но другие поля для текущего набора не определены, то игнорируем данный набор
        if(array_key_exists($v[0], $arr) && count($arr) != 5) $arr = [];
        //иначе добавляем поле в массив
        else $arr[$v[0]] = $v[1];
    }
    //если массив содержит пять полей, то добавляем в CSV 
    if(count($arr)==5) {
        //отсортировать поля данных согласно csv-заголовку
        $arr = array_replace(array_flip($keys), $arr);
        //значения полей массива в CSV как csv-строку
        $csv[] = implode(';', $arr);
        $arr = [];
    }
    
}

//в CSV формат
$csv = implode("\r\n", $csv);

//сохранем в файл, который потом можно будет скачать
file_put_contents('data.csv', $csv);


Здесь если найдено не все пять полей, а следующая запись это одно из полей, которое уже было обнаружено, то такая запись пропускается (хотя это навскидку и по идее не будет работать всегда должным образом, то есть тут нужно нечто более сердитое). К тому же изначально задается порядок полей так, как они должны быть представлены в csv-файле. По этому же порядку происходит и сортировка данных полей не зависимо от того как они следуют в исходном файле.

Ну и останется "дикое" представление времени преобразовать в человеческое.

Последний раз редактировалось laimas, 11.12.2016 в 18:55.
Ответить с цитированием
  #15 (permalink)  
Старый 12.12.2016, 14:22
Интересующийся
Отправить личное сообщение для SergeyPetrovA Посмотреть профиль Найти все сообщения от SergeyPetrovA
 
Регистрация: 30.08.2015
Сообщений: 14

Всё отлично! Еще раз огромное спасибо!!!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
График JS из txt или csv Darell Общие вопросы Javascript 0 23.04.2016 21:53
как выбрать цифру из строки? imedia Элементы интерфейса 5 18.09.2014 16:53
Выбрать число из строки Nihisil Общие вопросы Javascript 4 09.03.2011 08:49
Скрипт для рандомного отображения строки из txt gladushka Общие вопросы Javascript 8 12.11.2010 23:29
Разбор строки из txt файла guffer Общие вопросы Javascript 4 18.05.2010 10:21