我在FoxPro中创建了一个程序,它接受一个包含数据有限的CSV文件并分配值和其他内容,然后将其导出到逗号分隔的文本文件中。我遇到的问题是这个文件中连续有两个日期,每次运行该程序时都会改变。
以下是文本文件的一小部分示例: 5137851,“CU”,“0”,5/25/2013 0:00:00,“5/27/2013 0:00:00,”“,”“,”“,1,41,30,3, 41,32,4
我需要删除“5/27/2013 00:00:00
中”5“之前的引号现在我已经有了这段代码来删除某些区域的引号。
strRecord = STRTRAN(strRecord, '0:00:00"," "', '0:00:00",')
strRecord = STRTRAN(strRecord, '0:00:00"," "', '0:00:00",')
strRecord = STRTRAN(strRecord, '0:00:00",', '0:00:00,')
strRecord = STRTRAN(strRecord, '"CU","0","', '"CU","0",')
strRecord = STRTRAN(strRecord, '0:00:00,"5','0:00:00,5')
问题出现在最后一行,因为数字并不总是5,它将是文件所在的月份。我不能这样做:
strRecord = STRTRAN(strRecord, '0:00:00,"', '0:00:00,')
因为它会删除三个连续空字段中的第一个引号。
我想不出有任何其他方法可以编辑此文件以删除第二个日期时间字段中5之前的引号。
提前感谢您的帮助!
答案 0 :(得分:0)
如果您知道您需要更改的字段也位于列表中的某个位置,请使用仅影响该位置的代码。从您的代码示例中,您看起来已经在变量中有单行。所以,你有几个选择:
1)使用ALINES()将其分解成碎片,然后直接转到感兴趣的项目。然后,遍历数组以将行重新放在一起; 2)使用OCCURS()查找第n个逗号,然后按照以下内容进行操作。
由于这是VFP,还有很多其他方法可以做到这一点,但我会选择其中一种。
答案 1 :(得分:0)
我的方法与alines()处理不同。看起来您的文件在字段之间用逗号分隔,并且不确定“(未)应用的位置/原因的一致性。
此示例用于模拟创建记录的文本文件来自
TEXT TO lcVar noshow
5137851,"CU","0",5/25/2013 0:00:00,"5/27/2013 0:00:00,"","","",1,41,30,3,41,32,4
ENDTEXT
STRTOFILE( CHRTRAN( lcVar, '"', ''), "myText.txt" )
现在,阅读您拥有的原始文件,使用CHRTRAN()并从中删除所有“字符。然后立即将其写回新文件 - 在本例中为”myTextNoQuotes.txt“文件。
STRTOFILE( CHRTRAN( FILETOSTR( "myText.txt" ), '"', ''), "myTextNoQuotes.txt" )
接下来,从数据上下文创建所需列的游标。由于我不知道预期的实际列名或确认类型,我只是采样所有字段都是几个空格的字符。
CREATE CURSOR C_TmpImport;
( SomeID c(10),;
CUField c(10),;
Field3 c(5),;
SomeDate1 c(20),;
SomeDate2 c(20),;
Field6 c(5),;
Field7 c(5),;
Field8 c(5),;
Field9 c(5),;
Field10 c(5),;
Field11 c(5),;
Field12 c(5),;
Field13 c(5),;
Field14 c(5),;
Field15 c(5) )
现在,从“NoQuotes”版本文本文件追加到光标,并明确地让它知道分隔符是逗号。
APPEND FROM myTextNoQuotes.txt DELIMITED WITH ","
现在,如果您显然知道字段9-15是数字,只需更改CREATE CURSOR并提供更合适的名称。一旦采用表格格式,您就可以进行其他清理......
有时在导入时,我知道我需要进行清理,我实际上会添加最终数据类型的EXTRA列,并使用批量替换/更新命令放置数据的“已清理”版本...类似于......
...original part of create table..
Field14 c(5),;
Field15 c(5),;
CleanDate1 t,;
CleanDate2 t )
“t”是“日期/时间”字段的数据类型。然后...
REPLACE ALL
CleanDate1 WITH CTOT( SomeDate1 ),;
CleanDate2 WITH CTOT( SomeDate2 )
答案 2 :(得分:0)
如果你的字符串在结构上相当一致,你可以根据它在字符串中的位置运行一个更新。
strRecord = Strtran(strRecord,',"',',',3,1)
Strtran还有其他参数来定义要替换的字符串的出现次数以及它们中的多少次。
如果您在其他人替换之前运行了上面的行,那么它将会起作用。