Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Импорт из текстового файла  [new]
Pr0teus
Guest
Хотелось бы услышать мнение сообщества. Провожу вставку записей из txt файла. И для изменения одного поля в таблице использую следующий метод (из-за скорости, а именно быстрого решения проблемы типов полей). В таблицах только Numeric,Char,Integer других типов нет.


ON ERROR ll_foxerror=.T.

ll_foxerror=.F.
REPLACE mytable.field1 WITH VAL(txtvalue)

IF (ll_foxerror) THEN
REPLACE mytable.field1 WITH txtvalue
ll_foxerror=.F.
ENDIF

ON ERROR





ll_foxerror=.F.
ENDIF[src][/SRC]
14 ноя 06, 11:15    [3396133]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Ты бы сначала проверил КАК это будет работать.

create cursor test (f1 n(10))
append blank
replace f1 with val('пример')
browse nowait

"Видишь суслика?" В смысле, наблюдаешь хоть какое-нибудь сообщение об ошибке? НЕТ!

FoxPro молча преобразует слово "пример" в число 0. Без какого-либо ссобщения об ошибке. Так работает функция VAL().

Значит, весь твой код, основанный на предположении, что возникнет ошибка - не имеет смысла. Просто НЕТ ошибки.

Так что, остается один путь: проверять предполагаемый тип данных "вручную". Генератор ошибок не поможет.
14 ноя 06, 11:47    [3396454]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
Pr0teus
Guest
А наоборот. Просто в противном случае уж больно долго все идет.


ON ERROR ll_foxerror=.T.

ll_foxerror=.F.
REPLACE mytable.field1 WITH txtvalue

IF (ll_foxerror) THEN
REPLACE mytable.field1 WITH VAL(txtvalue)
ll_foxerror=.F.
ENDIF

ON ERROR


14 ноя 06, 11:54    [3396515]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
А ты не забыл, что содержимое текстового файла - это только текст. Там НЕТ числовых данных. Это значит, что заполнение текстового поля ВСЕГДА будет успешным.

Никуда не денешься от анализа данных. Если текстовый файл хоть как-то структурирован, т.е. можно сказать наверняка, что вот здесь число, а вот здесь - символьная строка, тогда есть возможность предварительного анализа.

Посмотри синтаксис команды APPEND FROM ... DELEMITED. Она как раз берет данные из текстового файла и автоматически все раскладывает по нужным полям. Разумеется, если сам текстовый файл структурирован.
14 ноя 06, 12:07    [3396645]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
Pr0teus
Guest
Текстовой файл структурирован. А именно [название поля]=[значение]. Он посути формируется по такой же таблице. В этом случае мой метод подходит?
14 ноя 06, 12:36    [3396918]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
AleksMed
Member

Откуда: Россия, Серпухов-Москва
Сообщений: 1546
Pr0teus
Текстовой файл структурирован. А именно [название поля]=[значение]. Он посути формируется по такой же таблице. В этом случае мой метод подходит?

Текстовый файл должен быть структурирован как таблица
14 ноя 06, 12:41    [3396958]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
Pr0teus
Guest
Он и так по сути структурирован как таблица. Просто не все записи присутствуют.

[запись 1]
[названи поля 1]=[значение1]
[названи поля 2]=[значение2]
[запись 2]
[названи поля 1]=[значение1]
[запись 3]
[названи поля 1]=[значение1]
[названи поля 2]=[значение2]
[названи поля 3]=[значение3]

И вставка ведется REPLACE mytable.&[названи поля 1]. WITH [значение1]
14 ноя 06, 12:50    [3397059]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
AleksMed
Member

Откуда: Россия, Серпухов-Москва
Сообщений: 1546
Pr0teus
Он и так по сути структурирован как таблица. Просто не все записи присутствуют.

[запись 1]
[названи поля 1]=[значение1]
[названи поля 2]=[значение2]
[запись 2]
[названи поля 1]=[значение1]
[запись 3]
[названи поля 1]=[значение1]
[названи поля 2]=[значение2]
[названи поля 3]=[значение3]

И вставка ведется REPLACE mytable.&[названи поля 1]. WITH [значение1]

Ну если только таблицу на бок положить
Вот такого вида д.б. текстовый файл:
[значение1]<разделитель>[значение2] ... <разделитель>[значениеN]
14 ноя 06, 13:05    [3397173]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
Владимир СА
Member

Откуда:
Сообщений: 7881
Открыть файл на низком уровне FOPEN() и анализировать его.
14 ноя 06, 13:25    [3397340]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
Pr0teus
Guest
Что-то не туда всех понесло 8) Файл есть, он структурирован, как показано выше, при его проходе выбирается поле и соответствующее ему значение. Вопрос заключался могу ли я применить такую конструкцию при модификации табличной записи.

ON ERROR ll_foxerror=.T.

ll_foxerror=.F.
REPLACE mytable.&[название поля из txt]. WITH [значение из txt]
IF (ll_foxerror) THEN
REPLACE mytable.&[название поля из txt]. WITH VAL([значение из txt])
ll_foxerror=.F.
ENDIF

ON ERROR

Спасибо Владимиру М за ответ. Как я понял в моем случае, т.к. файл жестко структурирован, этот метод можно применять.
14 ноя 06, 13:49    [3397553]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Посмотри вот это решение

https://www.sql.ru/forum/actualthread.aspx?tid=361184#3392561

Структура очень похожа. Думаю, легко сможешь перестроится.
14 ноя 06, 14:09    [3397744]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
AleksMed
Member

Откуда: Россия, Серпухов-Москва
Сообщений: 1546
Зачем так много?
REPLACE mytable.&[название поля из txt]. WITH IIF(TYPE([значение из txt])="N",VAL([значение из txt]),[значение из txt])
14 ноя 06, 14:10    [3397763]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
Pr0teus
Guest
2 AleksMed
Значение из txt всегда текст.
14 ноя 06, 14:29    [3397923]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
Pr0teus
Guest
И что если символьное поле содержит только '0'
14 ноя 06, 14:30    [3397942]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
Maltsev_MaxE
Guest
:-))

Анализируй не источник, а тип поля приемника !!!

Do Case
 case Type([названи поля 1])='N' then
  Replace  &[названи поля 1] with Val(Evaluate([значение1]))


и т. д.
14 ноя 06, 14:39    [3398011]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
AleksMed
Member

Откуда: Россия, Серпухов-Москва
Сообщений: 1546
Pr0teus
2 AleksMed
Значение из txt всегда текст.

Ты сначала попробуй и хелп по TYPE() почитай. :)
14 ноя 06, 15:25    [3398312]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Pr0teus
2 AleksMed
Значение из txt всегда текст.


lcText = "132465"
?m.lcText,"TYPE=", TYPE(m.lcText)

lcText = "пример"
?m.lcText, "TYPE=", TYPE(m.lcText)

Хотя использовать это надо крайне осторожно. А если текст совпадет с именем поля таблицы? Или переменной памяти?

create cursor test (f1 D)
lcText = "f1"
?m.lcText, "TYPE=", TYPE(m.lcText)

Т.е., "в общем случае", я бы не советовал этим пользоваться.
14 ноя 06, 16:44    [3399016]     Ответить | Цитировать Сообщить модератору
 Re: Импорт из текстового файла  [new]
Pr0teus
Guest
Спасибо. Но я все же остановлюсь на своем методе. Или же на анализе поля приемника. Поле и так имеет заведомо корректное значение, т.к. выгружалось из такой же таблицы. Т.е. полю таблице четко соотвествует его значение, которое в него должно вставиться, только тип надо подменить (строковой или число).

P.S.
Текстовой файл у меня представляет документ XML, а парсинг ручками делаю через объект MSXML2.DOMDocument.3.0.
15 ноя 06, 11:46    [3402276]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить