用txt文件VFP替换表值

时间:2016-05-23 11:16:28

标签: visual-foxpro foxpro dbase xbase

我试图用txtfile中的信息替换phc表但是我没有在屏幕上获取信息。

re是要替换值的表 txtcabecalho是人们必须选择的导入文件 reciboc是我创建的光标,用于存储txt文件中的值,因此我可以在re上替换它们并将它们显示在屏幕上 sre是表格的屏幕。

    Local txtcabecalho
Use re
Delete all
txtcabecalho=getfile("txt")

Create cursor reciboc(rno n(10), rdata d(10), moeda c(3), no n(10), nome c(2), ccusto c(20), intid c(10), clbanco c(20), total float(19), totalmoeda float(19), ndoc n(3))


append from (txtcabecalho) delimited with tab
select reciboc
goto top
scan for !empty(reciboc.rno)

select re
append blank
replace re.rno with reciboc.rno 
replace re.rdata with reciboc.rdata
replace re.moeda with reciboc.moeda
replace re.no with reciboc.no
replace re.nome with reciboc.nome
replace re.ccusto with reciboc.ccusto
replace re.intid with reciboc.intid
replace re.clbanco with reciboc.clbanco
replace re.total with reciboc.total 
replace re.totalmoeda with reciboc.totalmoeda 
replace re.ndoc with reciboc.ndoc
select re
endscan

sre.refresh()

谢谢!

更新

所以这实际上有效,如果我用我选择的delimitianion来创建我自己的文件,例如使用制表符。我需要导入的文件就像使用空格作为空间持有者并且没有相互划分。让我解释一下。例如前三个字段rno和rdata以及moeda。

txt文件来自22014-12-23EUR

2是rno 但是有9个空格后面的工作就像占位符更大的数字使rno(10) 接下来是2014-12-23,它就在rno旁边,没有划界的rdata(10) 接下来是欧元的莫达,再次没有划界,是莫达(3)

许多字段都是空白的,而那些txt文件的空格占据了字段的全长。基本上,字段长度用作分隔,当空时,它用空格填充。

你明白了吗?抱歉,我不是英国人。

更新

heres是txt文件中的一部分22014-11-27EUR 208 799,00 799,00 00

请记住,在第一个数字2之前,有9个空格。 谢谢!

rdata字段将填满2014-11-27是rdata d(10)

编辑

目前代码:

Local txtcabecalho, fileconvert
Use re
zap
txtcabecalho=getfile("txt")
Create cursor reciboc(rno n(10), rdata d(10), moeda c(3), no n(10), nome c(2), ccusto c(20), intid c(10), gg c(20), chq c(20), clbanco c(20), total float(19), totalmoeda float(19), ndoc n(3))

fileconvert = filetostr(txtcabecalho)
chrtran(fileconvert,'-','')
strtofile(fileconvert, txtcabecalho)

append from (txtcabecalho) type sdf
scan 
select re
append blank
replace rno with reciboc.rno 
replace rdata with reciboc.rdata
replace moeda with reciboc.moeda
replace no with reciboc.no
replace nome with reciboc.nome
replace ccusto with reciboc.ccusto
replace intid with reciboc.intid
replace clbanco with reciboc.clbanco
replace total with reciboc.total 
replace totalmoeda with reciboc.totalmoeda 
replace ndoc with reciboc.ndoc
select re

endscan
select reciboc
browse title "resultado"

reindex
sre.refresh()

我得到的是this is what i get

stiling strying弄明白我真的不认识。

例如:第一行应该是:

RNO 2 RDATA 2014-11-27 NO 208

EDITED

实际上这使它成为了一个

fileconvert = filetostr(txtcabecalho)
fileconvert2 = strtran(fileconvert,'-','')
strtofile(fileconvert2, txtcabecalho)

如果我需要进一步的帮助,我会更新我的问题!非常感谢你们!

EDITED

Doyou们知道从txt文件浮点数转换为游标是否有任何问题?

我得到了例如799,20,但我只是显示为799.数据类型设置为totalmoeda f(19)。这一定很简单,但我找不到它!

4 个答案:

答案 0 :(得分:0)

您正在执行SCAN循环,这意味着reciboc表中有许多行。但是,在你的" re"表,你只是用相同的值覆盖同一行,如果文件中没有记录,你无论如何都没有。如果你想添加它们,你需要附加到" RE"表

现在,另一个考虑因素是" rno"柱。这应该是一个" ID"诸如外部文本文件之类的列可能具有每个给定" RNO"的更新值。如果它还不存在你想要更新,或者如果它不存在于" re"表

使用标签和额外明确的元素更新您的问题...

如果你有一个索引" RE"关于" RNO"的表格专栏,很棒。如果没有,那就是你想要更新的关键列,我建议在它上面创建一个索引...

在VFP命令窗口中,构建索引以使其始终可用

use RE exclusive
index on RNO tag RNO
use

现在,在你的代码中,你的附加分隔后,你的光标已经准备好......我会设置一个活动表和你的临时光标之间的关系,然后进行更新...

选择reciboc RNO标签RNO&&所以光标也有一个索引。

选择RE 将与RNO的关系设置为RECIBOC

现在,两个表彼此指向,以查找每个表中匹配的记录。现在,替换FOR [范围]。由于这种关系,记录在" RE"表,它将指向" RECIBOC"中的相同RNO记录。表格如果存在。所以FOR条件是测试NOT EOF()(文件结尾=在RECIBOC中找不到匹配。所以NOT EOF()表示找到了一条记录。

replace rdata with reciboc.rdata,;
        moeda with reciboc.moeda,;
        no with reciboc.no,;
        nome with reciboc.nome,;
        ccusto with reciboc.ccusto,;
        intid with reciboc.intid,;
        clbanco with reciboc.clbanco,;
        total with reciboc.total,;
        totalmoeda with reciboc.totalmoeda,;
        ndoc with reciboc.ndoc ;
   FOR NOT EOF( "RECIBOC" )

最后,获得任何新的" RNO"记录到你的" RE"表。根据匹配的" RNO"获取不在现有RE表中的所有记录。列。

select * ;
   from RECIBOC ;
   WHERE RNO NOT IN ( select RNO from RE );
   into cursor NewRecordsToAdd readwrite

现在,将它们添加到" RE"表。由于列是相同的名称,因此它们将直接过来而没有来自/引用的显式列名。

select RE
append from dbf( "NewRecordsToAd" )
use in select( "NewRecordsToAdd" )   

答案 1 :(得分:0)

Create Cursor reciboc(rno N(10), rdata d(10), moeda c(3), no N(10), ;
    Nome c(2), ccusto c(20), intid c(10), clbanco c(20), ;
    Total Float(19), totalmoeda Float(19), ndoc N(3))

Append From (m.txtcabecalho) Type Delimited With Blank

Select re
Append from (Dbf('reciboc'))

以上是您尝试做的较短版本。

答案 2 :(得分:0)

在您的更新中,您所描述的是固定宽度数据格式或所谓的系统数据格式(SDF)。然后不要使用分隔但SDF作为类型:

Create Cursor reciboc(rno C(10), rdata C(10), moeda c(3), no C(10), ;
    Nome c(2), ccusto c(20), intid c(10), clbanco c(20), ;
    Total C(19), totalmoeda C(19), ndoc C(3))

Append From (m.txtcabecalho) Type SDF

alter table reciboc alter column rdata d && convert rdata column to date
* do other needed column type conversions

Select re
Append from (Dbf('reciboc'))

创建光标时使用的大小应与文本文件中数据列的大小相匹配。在将整个数据作为文本获取后,更改列以匹配数据类型(我假设您的大小是正确的) - d(10)没有意义,并且float永远不是建议的类型。

PS:如果你能找到FoxyClasses那么它确实有一个导入器类可以为你处理大部分工作(不幸的是我丢失了服务下载的服务器)。如果可以找到,您可以在其chm文件中阅读详细信息。

答案 3 :(得分:0)

在2之前恰好有9个空格对我有用:

Create Cursor reciboc(rno C(10), rdata C(10), moeda c(3), no C(10), ;
    Nome c(2), ccusto c(20), intid c(10), clbanco c(20), ;
    Total C(19), totalmoeda C(19), ndoc C(3))

Append From (m.txtcabecalho) Type SDF
browse title "Before data type change"

Set Date YMD
Set Century ON

alter table reciboc alter column rdata d && convert rdata column to date
browse title "After date type change"

如果是SDF,请记住文本文件中的位置指定字段宽度。