On-line: Andrey, PSP, SergKis, гостей 1. Всего: 4 [подробнее..]
АвторСообщение



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 16.01.07 17:44. Заголовок: преобразование csv формата в текстовой с разделителями в одной колонке


Подскажите пожалуйста какими функциями и с какой библиотеки
можно воспользоваться для преобразования csv формата в текстовой с разделителями в одной колонке
например получить из |1|22222|33|
|1111111 |2|33333333|
что-то типа |1 |22222|33 |
|1111111 |2 |33333333|
если можна фрагмент кода



Спасибо: 0 
Цитата Ответить
Ответов - 14 [только новые]


администратор




Пост N: 611
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.01.07 19:29. Заголовок: Re:


anker пишет:

 цитата:
например получить из |1|22222|33|
|1111111 |2|33333333|



anker пишет:

 цитата:
что-то типа |1 |22222|33 |
|1111111 |2 |33333333|



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


 цитата:

STRTRAN(<строка символов>, <замещаемая подстрока>,
[<замещающая подстрока>], [<начало замены>],
[<число замен>]) --> новая строка символов




Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 18.01.07 10:59. Заголовок: Re:


Фрагмент реального файла в котором могут быть тысячи строк
222295|999999912|30.11.2005|113865.83|1000000018|0.0||-1|1|1|
2855192|999999869|18.03.2006|42.21|1000000009|0.0||1|1|1|
желательно преобразовать в
222295_|999999912|30.11.2005|113865.83|1000000018|0.0||-1|1|1|
2855192|999999869|18.03.2006|42.21____|1000000009|0.0||1_|1|1|
"_" в даном случае пробел
мажду разделителями неизвестно наперед сколько символов и какие
(каждый раз по разному) подстрока врядли пойдет
Мысль (может совсем и не верная)
1 сканировать поочередно каждый символ строки
и переносить его в другой файл поочередно
2 если символ "|" то в другой файл в определенную позицию
1-й в 20 2-й в 40 и т д далее поочередно
3 конец строки по chr(10) chr(13) или иначе
но какими функциями и желательно из библиотек
toolssh.lib nanfor.lib clipper.lib

Спасибо: 0 
Цитата Ответить





Пост N: 99
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 18.01.07 12:20. Заголовок: Re:


Я так думаю, что одним проходом по файлу здесь не обойтись

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 29
Зарегистрирован: 15.11.05
ссылка на сообщение  Отправлено: 18.01.07 13:57. Заголовок: Re:


anker пишет:

 цитата:
Фрагмент реального файла в котором могут быть тысячи строк
222295|999999912|30.11.2005|113865.83|1000000018|0.0||-1|1|1|
2855192|999999869|18.03.2006|42.21|1000000009|0.0||1|1|1|
желательно преобразовать в
222295_|999999912|30.11.2005|113865.83|1000000018|0.0||-1|1|1|
2855192|999999869|18.03.2006|42.21____|1000000009|0.0||1_|1|1|
"_" в даном случае пробел



Зачем такие преобразования?
Что дальше нужно делать?
Если говорить о реальном файле, то в CLIPPER TOOLS (CT3) есть пример, который реализует разбор файла на строки, которые заканчиваются chr(10) chr(13). Хотя есть и без (CT3)
Далее строки раpбираешь по элементам функциями семейства TOKEN*
Или сам используя AT() и SUBSTR()


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 100
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 18.01.07 14:13. Заголовок: Re:


Можно поиграться с этим - только конкретней поставь задачку.
На двух строчках не совсем ясно.

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 18.01.07 15:44. Заголовок: Re:


задача вообще-то вытянуть из
нескольких таких
222295|999999912|30.11.2005|113865.83|1000000018|0.0||-1|1|1|
2855192|999999869|18.03.2006|42.21|1000000009|0.0||1|1|1|
файлов информацию в соответствующие dbf- файлы
а затем написать маленькую програмулю
где бы пользователь задал период
и получил отчет
я почемуто решил что легче не напрямую из csv в dbf
а в промежуточный txt
222295_|999999912|30.11.2005|113865.83|1000000018|0.0||-1|1|1|
2855192|999999869|18.03.2006|42.21____|1000000009|0.0||1_|1|1|
а затем функцией FT_FREADLN() из nanfor.lib
достать в dbf
но видимо знающие люди делают по- другому

Спасибо: 0 
Цитата Ответить
администратор




Пост N: 612
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 18.01.07 17:22. Заголовок: Re:


Это типа выписки банка я так понял (хотя роли это не играет) ?
Делал такое....при чем у каждого банка свои форматы как TXT ,CSV так и DBF
А по теме можно сделать так.....на первый взгляд.
Формат строк одинаков насколько я понял ?
Да можно обработать строки с помощью FT_FREADLN() , только мне кажется что
промежуточного файла тут не нужно , вообще ни какого.
Ты ведь задал период , верно ? Где у тебя лежит дата ты знаешь , а именно лежит она
между 2 и 3 разделителем. "Вынул" дату - преобразовал ее из симовльного формата
в дату и сравнил с интервалом. Если не подходит ......значит FT_FSKIP(); LOOP (если в цикле)
Остальные данные извлекаешь по похожей схеме.

PS
После считывания строки с помощью FT_FREADLN() , попутно можно проверить корректность
формата. Например кол-во разделителей. В твоем примере их 10 в строке (если я не ошибся).
Если не 10 , тогда строку дальше не обрабатываем и тд и тп

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 102
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 18.01.07 17:30. Заголовок: Re:


Я себе представляю вот так:

ccc := "222295|999999912|30.11.2005||1"+CRLF+;
"2855192|999999869|18.03.2006||2"
ccc := StrTran(ccc,"|",",")
MemoWrit("file.txt",ccc)

dbCreate("file.dbf",{ {"F1","N",10,0},{"F2","N",10,0},{"F3","D",8,0},{"F4","N",3,0},{"F5","N",1,0} })
USE file.dbf
APPEND FROM file.txt DELIMITED

Только даты нужно преобразовывать в формат yyyymmdd или поле сделать символьным.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 613
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 18.01.07 17:42. Заголовок: Re:


Можно и так конечно :)

ort пишет:

 цитата:
ccc := StrTran(ccc,"|",",")


покатит если ни где нет текста в котором уже может быть запятая.
у меня был такой случай ;) один клиент-банк сбрасывал инфу в CSV , разделитель
точка с запятой (;) , при чем это было жестко у них зашито в проге. А я этот
файлик обрабатывал для получения отчета с минимальной проверкой формата.
И те строки в которых уже была ; (типа назначение платежа) в отчет не попадали...со всеми вытекающими ;)

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 103
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 18.01.07 18:19. Заголовок: Re:


Dima пишет:

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


Конечно, если есть запятая, то нужно выкручиваться иначе.
Но в прилагаемых строках ее нет.

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 19.01.07 12:19. Заголовок: Re:


Спасибо за идеи, но мне как делетанту это сложновато
не совсем понятно или совсем непонятно
зачем менять символы
ccc := StrTran(ccc,"|",",") // будем иметь
222295,999999912,30.11.2005,113865.83,1000000018,0.0,-1,1,1,
2855192,999999869,18.03.2006,42.21,1000000009,0.0,1,1,1,
что это меняет в строке, главное позиции начала даты и сумы не изменились
зачем это писать в новый файл
MemoWrit("file.txt",ccc) (будем иметь два аналогичных файла)
в общем непонятно зачем менять символы (символы меня устраивают
не устраивает что разделитель в разных строках стоит в разных позициях)
и зачем искать что-то в строках
мне надо проще
я должен знать что с какой позиции в строке лежит
с какой позиции дата с какой сумма зайти и взять
приблизительно так
c_string = ft_freadln() //взял всю строку из файла
n_summa = val(substr(c_string,29,9)) //беру сумму с 29- позиции 9 символов
но это не работает
в первой строке "113865,83"
во второй "|42.21|10"
Так что видимо прийдется отказаться от этой идеи csv->txt->dbf
или csv->dbf а програмулю писать которая берет данные только из dbf
или перенести это творчество на неопределенное время
может затем вернуться и посмотреть на все это по новому
спасибо всем за помощь

Спасибо: 0 
Цитата Ответить
администратор




Пост N: 615
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.01.07 13:24. Заголовок: Re:


anker anker пишет:

 цитата:
Так что видимо прийдется отказаться от этой идеи csv->txt->dbf
или csv->dbf а програмулю писать которая берет данные только из dbf
или перенести это творчество на неопределенное время
может затем вернуться и посмотреть на все это по новому
спасибо всем за помощь


Тут работы на 30 минут ;)
Вот же .......чем не подходит ?
Dima пишет:

 цитата:
Это типа выписки банка я так понял (хотя роли это не играет) ?
Делал такое....при чем у каждого банка свои форматы как TXT ,CSV так и DBF
А по теме можно сделать так.....на первый взгляд.
Формат строк одинаков насколько я понял ?
Да можно обработать строки с помощью FT_FREADLN() , только мне кажется что
промежуточного файла тут не нужно , вообще ни какого.
Ты ведь задал период , верно ? Где у тебя лежит дата ты знаешь , а именно лежит она
между 2 и 3 разделителем. "Вынул" дату - преобразовал ее из симовльного формата
в дату и сравнил с интервалом. Если не подходит ......значит FT_FSKIP(); LOOP (если в цикле)
Остальные данные извлекаешь по похожей схеме.

PS
После считывания строки с помощью FT_FREADLN() , попутно можно проверить корректность
формата. Например кол-во разделителей. В твоем примере их 10 в строке (если я не ошибся).
Если не 10 , тогда строку дальше не обрабатываем и тд и тп



Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 104
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 19.01.07 13:38. Заголовок: Re:


anker пишет:

 цитата:
Спасибо за идеи, но мне как делетанту это сложновато


Правильно - дилетант

anker пишет:

 цитата:
зачем менять символы


Нужно менять, чтобы привести к нужному формату для команды APPEND FROM file.txt DELIMITED

anker пишет:

 цитата:
зачем это писать в новый файл



Это я для себя пишу в файл, чтобы потом прочитать из него. Тебе, конечно, не нужно.
anker пишет:

 цитата:
Так что видимо прийдется отказаться от этой идеи csv->txt->dbf


Не нужно отказываться от идеи.
Если попроще, то можно так:
читаешь строку, потом преобразуешь в массив функцией ListAsArray( <cList>, <cDelimiter> ) --> aList
Она есть в поставке Clipper в файле STRING.PRG, преобразует строку с разделителями в массив
Дата всегда будет третьим элементом в этом массиве.
А далее - можно добавить записи в дбф или двухмерный массив...


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 12
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 21.01.07 02:04. Заголовок: Re:


я б предложил такой вариант - не связываться с файловыми функциями, а
создать структуру ДБФ с одним строковым полем длины максимальной строки,
подгрузить в него текстовый файл
APPEND FROM xxx.txt SDF
и далее обрабатывать в цикле записи этого файла, используя столь любимые мной TOKEN из Clipper Tools
pole1:=token(stroka,'|',1)
pole2:=token(stroka,'|',2)
и т.д
разделители конечно любые, какие могут встречаться
ну а дальше - то ли обработка полученных полей, то ли выгрузка их в целевой дбф - по вкусу








Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 342
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет