0

我在 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 之前的引号。

提前感谢您的帮助!

4

3 回答 3

0

如果您的字符串在结构上相当一致,您可以根据它在字符串中的位置运行更新。

strRecord = Strtran(strRecord,',"',',',3,1)

Strtran 有额外的参数来定义要替换的字符串的出现次数以及它们的数量。

如果您在其他替换之前运行了上面的行,它将起作用。

于 2014-05-19T17:32:44.580 回答
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 )
于 2013-05-21T02:36:58.663 回答
0

如果您知道需要更改的字段也在列表中的某个位置,请使用仅影响该位置的代码。从您的代码示例中,看起来您已经在变量中有单行。所以,你有几个选择:

1) 使用 ALINES() 将其分成几部分,然后直接转到感兴趣的项目。然后,循环遍历数组以将行重新组合在一起;2) 使用 OCCURS() 找到第 n 个逗号,然后对后面的内容进行操作。

由于这是 VFP,因此有很多其他方法可以做到这一点,但我会选择这两种方法中的一种。

于 2013-05-20T20:49:45.890 回答