Как справиться с проблемой разбиения файла?

Здравствуйте.
Вот есть текстовый файл:
0. Status (Read)
Date/time: 20/05/2014 15:31:38 +0600
Number: +7xxxxx Number2: +7xxxxx
Text:
test test
1. Status (Read)
Date/time: 20/05/2014 15:31:38 +0600
Number: +7xxxxx Number2: +7xxxxx
Text:
test test

Необходимо извлечь данные из полей. Поля повторяются (Id, status, date/time и т.д.)
Пробовал и все в одну строку, и другими способами. Не получается.
Может, БД необходимо использовать?
Не могли бы вы помочь?
  • Вопрос задан
  • 2384 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Что-то такого плана:
// $text - разбираемый текст
$num = -1;
$data = array();
foreach (preg_split("/^\s*(\d+)\.\s+Status\s+/m", $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $part) {
	if (preg_match("/^\d+$/", $part))
		$num = $part;
	if (preg_match("/\((.*?)\)\s*$\s*Date\/time:\s+(.*?)\s*$\s*Number:\s+(.*?)\s+Number2:\s+(.*?)\s*$\s*Text:\s*$(.*)/sm", $part, $res)) {
		$data[$num]['status'] = $res[1];
		$data[$num]['date'] = $res[2];
		$data[$num]['number'] = $res[3];
		$data[$num]['number2'] = $res[4];
		$data[$num]['text'] = $res[5];
	}
}
var_dump($data);

Но потом разобранные данные лучше записать в базу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Что на выходе должно получится? И на каком ЯП вы это пытались сделать/нужно чтобы было? И где ваши попытки?
Ответ написан
Комментировать
shaks
@shaks
Ну как бы да) для таких целей принято использовать БД (sqlite например)
Либо хранить информацию в файле в json или xml формате.

То как это делаете вы - неприемлемо, обычно когда хранят информацию в файле в текстовом виде, данные разбивают по меткам, и по этим же меткам их потом собирают в кучу. Например

1|Read|20/05/2014 15:31:38 +0600|+7xxxxx Number2: +7xxxxx|test test
2|Read|20/05/2014 15:31:38 +0600|+7xxxxx Number2: +7xxxxx|test test
3|Read|20/05/2014 15:31:38 +0600|+7xxxxx Number2: +7xxxxx|test test
4|Read|20/05/2014 15:31:38 +0600|+7xxxxx Number2: +7xxxxx|test test

В данном случае меткой является знак "|" Программист открывает файл, функцией explode разбивает строку на массив (через метку), и получает данные, заведомо зная что на первой позиции у него id, на второй статус и так далее..
Но к такому методу прибегают тогда, когда запись может уместиться в одну строчку, и программист знает что одна строка == одной записи. У Вас же имеется тектовое поле, которое может содержать как перевод коретки на новую строку, так и "случайным образом" туда может попасть ваша метка. В таком случае удобнее и практичнее будет использовать какую либо легкую базу данных - sqlite яркий пример такой.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы