Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];

Вниз

Помогите с алгоритмом (восстановлено)   Найти похожие ветки 

 
app   (2003-05-15 12:46) [0]

Случайно удалено, восстановлено

tovSuhov (15.05.03 11:16)
Уперся рогом...В башку что-то свежих идей не приходит...
Вообщем задача - вычленить из строки имя файла. Строки в таком формате:

drwxr-xr-x 1 ftp ftp 0 Apr 05 12:50 Video2
drwxr-xr-x 1 ftp ftp 0 Mar 18 16:55 Wallpapers
-rw-r--r-- 1 ftp ftp 813 Mar 21 00:52 my coordinates.txt
-rw-r--r-- 1 ftp ftp 1825 Mar 29 17:50 news.txt
drwxrwxr-x 5 debian debian 4096 May 29 2002 debian-cd

Универсальной и правильной функции получения имени файла так и не могу придумать. На данный момент реализовал функцию так, что корректное имя возвращается, если оно содержит не более 10 пробелов. К тому же, если в имени файла 2(и более) пробела подряд, то сохраняется только один.

Мастера, помогите с более правильным алгоритмом.
С уважением, Сергей.

---
PVOzerski © (15.05.03 11:21)
В большинстве случаев (кроме последнего) можно бы завязаться на последнее двоеточие в строке и первый пробел после него.

---
Palladin © (15.05.03 11:21)
сразу бросается в глаза постоянное место начала имени

Dms (15.05.03 11:24)
1. постоянное начало имени
2. читаешь до конца строки

---
PVOzerski © (15.05.03 11:24)
2Palladin ©: а есть уверенность, что в оригинале эта выровненность не за счет #9?

---
Palladin © (15.05.03 11:27)
нету

---
Sandman25 © (15.05.03 11:35)
Если эти строки получены из TNMFTP, то лучше использовать NList, а не List. А в List имя файла действительно имеет постоянное расположение (что-то типа [66,75]).

---
evvcom © (15.05.03 11:37)
Значит еще бросается в глаза, что столбцы все же разделены одним или несколькими пробелами (или #9) и нужные данные находятся в 9 столбце при нумерации с 1.

---
tovSuhov (15.05.03 11:41)
Это не TNMFTP (глючнейший, кстати, компонентишка). Да и NList мне в любом случае не подходит.
Дальше - положение файла считаю НЕПОСТОЯННЫМ. Возможны варианты типа:

-rw-r--r-- 1 myftpcoolserver myftpcoolserver 1825 Mar 29 17:50 news.txt

наряду с

drwxrwxr-x 5 debian debian 4096 May 29 2002 debian-cd

---
tovSuhov (15.05.03 11:46)
Насчет столбцов - уже теплее. Т.е. вычислять 9-ый столбец, который и есть имя файла...Хм... Стоит попробовать...

---
Palladin © (15.05.03 11:48)
тут нужен синтаксический анализатор строки, скажем синтаксис первой позиции понятен, ее выделить можно, так же можно выделить синтаксис даты и номера (второй позиции), так же размера,
вывод: если все это однозначно (жестко) определено синтаксисом, то вполне реально добратся до имени...

---
evvcom © (15.05.03 11:58)

> tovSuhov (15.05.03 11:41)

Это доказывает, что используется табуляция.

---
Sandman25 © (15.05.03 12:01)
Да, TNMFTP, действительно содержит кучу глюков. Например, List перестает работать, если вызывать его несколько раз подряд.
Хотя NList в той же ситуации работает.

Насчет поиска имени файла - а почему бы не попытаться сканировать с конца строки? Если в имени файла не могут быть пробелы/табуляции...

---
evvcom © (15.05.03 12:03)

> Если в имени файла не могут быть пробелы/табуляции...

Вот именно, что могут. А компоненты TNM**** наверное все глючные. Я когда-то пробовал TNMHTTP - весь исплевался.

---
TCrash © (15.05.03 12:04)
Читай строку с конца и проверяй на наличие цифры после пробела. Врядли кто сделает такое имя файла. И вообще, по хорошему, имя файла не должно содержать пробелов. Воспитывайте юзеров на DOS 3.0.

---
tovSuhov (15.05.03 12:06)
>Sandman25
Как раз могут (и присутствуют)пробелы.

А что дает тот факт, что в качестве разделителей - табуляция? Упрощает задачу?


 
app   (2003-05-15 12:46) [1]

---
tovSuhov (15.05.03 12:08)
Еще раз повторяю - и цифры, и пробелы - все присутствует по полной программе :-)

---
Skier © (15.05.03 12:08)
>tovSuhov
Как вариант :
1) Создать массив 0..11 из названий месяцев.
2) Сканировать с конца строки
3) Сканировать до тех пор пока не встретиться название месяца
(при сканировании если встречается пробел, то "обнулять"
строку сравнения)
4) после нахождения имени месяца сканируем в другую сторону, пока
не "накопим" 3 пробела

Минус : если пробел - это действительно пробел, если нет - проблемы...

---
Anatoly Podgoretsky © (15.05.03 12:09)
Уверенность что не таб есть, это вывод из *nix систем, кроме того это хорошо видно из

drwxr-xr-x 1 ftp ftp 0 Mar 18 16:55 Wallpapers
-rw-r--r-- 1 ftp ftp 813 Mar 21 00:52 my coordinates.txt
-rw-r--r-- 1 ftp ftp 1825 Mar 29 17:50 news.txt


всегдм можно рассчитывать на точное количесто столбцов, разделенное неопределенным количеством пробелов, по этому достаточно найти положение девятого столбца и от него копировать до конца.

Есть одно но, не относящее к этому алгоритму, по всей видимости это вывод команды LIST из FTP, если это так то формат ее не фиксирован, на текущий момент существуе по крайней мере свыше 50 форматов выдачи. Этот же наиболее распространенный.

---
Anatoly Podgoretsky © (15.05.03 12:11)
Если мое предположение верно, то рекомендую посмотреть формат ftp.mcafee.com как наглядный.

---
Skier © (15.05.03 12:14)
>tovSuhov
Поправлюсь...
4) после нахождения имени месяца сканируем в другую сторону, пока
не "накопим" 3 строки из пробелов

---
tovSuhov (15.05.03 12:15)
Это действительно результат команды LIST (возвращается компонентом TIdFTP)
Посмотрел на результат в HEXе - там табуляцией и не пахнет - пробелы (#20)

---
Sandman25 © (15.05.03 12:16)
Тогда остается только поиск девятой колонки, как кто-то уже предлагал.
Идти с начала строки, после нахождения пробела/табуляции игнорировать последующие пробелы/табуляции до нахождения отличного от них символа. И так 8 раз. Затем брать остаток строки - это и есть имя файла.
В правах на файл, id пользователя, логине пользователя и группы, размере файла пробелов/табуляций быть не может. В дате/времени изменения файла всегда 3 элемента ((месяц, день, время) или (месяц, день, год)), в которых тоже не может быть пробелов.

---
evvcom © (15.05.03 12:17)

> Уверенность что не таб есть, это ...

> Это доказывает, что используется табуляция.

Точнее будет сказать: Это доказывает, что табуляция используется. Т.е. вместе с пробелами.

---
Sandman25 © (15.05.03 12:18)
Oops, во второй колонке не id пользователя. Что-то я напутал :(

---
tovSuhov (15.05.03 12:19)
К имени месяца привязываться не стоит. Где гарантия, что сервер не напишет April вместо Apr?

Да, вариант с поиском 9-го столбца мне более всего импонирует. Наверное на нем и остановлюсь. Спасибо всем, кто участвовал в "мозговом штурме".
С уважением, Сергей.

---
evvcom © (15.05.03 12:19)

> tovSuhov (15.05.03 12:15)

Да в принципе и неважно: пробелы, табуляция...

---
Anatoly Podgoretsky © (15.05.03 12:20)
Ладно оставим доказательство в покое, хотя там нет табуляции

---
Skier © (15.05.03 12:21)
>tovSuhov (15.05.03 12:19)

> Где гарантия, что сервер не напишет April вместо Apr?

Гарантии, конечно, нет.
Я просто исходил из приведённого тобой куска, в котором названию
месяца можно "доверять".

---
tovSuhov (15.05.03 12:28)
To Skier:
Более того, нет абсолюно никакой гарантии, что файл не будет называться Apr.txt :-)

---
Anatoly Podgoretsky © (15.05.03 12:30)
tovSuhov (15.05.03 12:19)
Гарантия есть, это может быть и не месяц вообще, а год, но обязательно одной колонкой.
Ты главного не объяснил, что это такое, зачем делаешь, если надо получать файлы с известного сервера, то это одно, если из разных то это другое. Во всяком случае посмотри мои замечания насчет форматов и сходи на приведенный сервер, может это даст повод для размышления.



 
tovSuhov   (2003-05-15 13:18) [2]

В итоге родил такую вещь. Функция возвращает строку, начиная с n-ой колонки (в нашем случае с 8-ой).
Если есть предложения по рационализации - с удовольствием выслушаю.

AnsiString GetCol(AnsiString str,int col)
{
int c_col=0;
int ps = 0;
// Заменяем знаки табуляции на пробелы
while (str.Pos("\t")>0)
{
str[str.Pos("\t")] = " ";
}
while ((str.Pos(" ")>0)&&(c_col < col))
{
ps = str.Pos(" ");
if (str[ps+1] != " ") c_col++;
str.Delete(1,ps);
}
return str;
};


Еще раз спасибо всем за помощь!


 
Skier   (2003-05-15 13:21) [3]

>tovSuhov (15.05.03 13:18)
// Заменяем знаки табуляции на пробелы
StringReplace(...) ?


 
Anatoly Podgoretsky   (2003-05-15 13:24) [4]

Можно обойтись и без всего жтого с заменой, CommaText


 
Calm   (2003-05-15 15:02) [5]

Коллеги, а как же регулярные выражения? Канули в лету?
Использование TRegExpr (на torry наверняка лежит) просто снимает эту и подобные ей проблемы!


 
Satirus   (2003-05-15 16:22) [6]

Лучше сделай это скриптом на шелле под юниксами:
ls -l |awk {"print $9"}


 
Sandman25   (2003-05-15 16:47) [7]

2Satirus
Тогда уже логичнее
ls -1


 
Satirus   (2003-05-15 17:08) [8]

2Sandman25 © (15.05.03 16:47)
тоже вариант.
Но мой более универсальный - на тот случай, если вдруг понадобится любая другая колонка.


 
Sandman25   (2003-05-15 17:18) [9]

2Satirus
Не спорю. Это и мне интересная информация оказалась.

К сожалению, автору топика ls не поможет - ему ж данные TIdFTP дает, доступа к unix-серверу нет.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.014 c
3-83322
Stas
2003-05-07 09:22
2003.05.26
SQL и IP


4-83824
Prooksius
2003-03-31 15:02
2003.05.26
Хэндл другого процесса


1-83498
tovSuhov
2003-05-15 11:36
2003.05.26
По поводу потоков...


1-83457
NewBegginer
2003-05-12 20:44
2003.05.26
Работа с масками вида xyz* ну или что-то подобное


3-83416
Hmuriy
2003-05-06 22:25
2003.05.26
символьное поле





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский