PowerBuilder 覆盖 txt 文件以使其制表符分隔
PowerBuilder overwrite txt file to make it tab separated
我有一个简单的问题,但我现在很忙,我想知道是否有人可以帮助我,
我需要 PB 中的代码部分,它将覆盖 txt 文件并使其以制表符分隔。
考虑一个 insert.txt 文件,格式如下
533#0000000000007851
594#0000000000006937
36#0000000000005667
.....
我想用PB代码覆盖它,做成这样
533 0000000000007851
594 0000000000006937
36 0000000000005667
......
因此 # 将被删除并成为选项卡...
我希望你能理解这个问题
请帮我一些忙,任何帮助将不胜感激
提前致谢
我想我找到了方法,如果我错了请指正
- 使用 importfile 将所有数据插入到单个列中的数据存储中
- 逐行找到 # 并将其替换为制表符,然后将 2 个新值插入另一个 ds
- 导出文件
以上是否正确?
您的回答是正确的,但可以更简单。
1) 将文件导入为单列
2) 解析每行中的值以查找类似于此的“#”:
integer li
string ls_a, ls_b, ls_rowvalue
FOR li = 1 TO dw_import.Rowcount()
ls_rowvalue = dw_import.object.columnwithdata[li]
ls_a = Right(ls_rowvalue, Pos(ls_rowvalue, "#") - 1)
ls_b = Mid(ls_rowvalue, Pos(ls_rowvalue, "#") + 1)
//put the values into a new datawindow
NEXT
dw_newvalues.Saveas("C:\temp\newstuff.txt)
默认'saveas'类型是文本!这是制表符分隔的。
for li=1 to lds_cons_buffer.rowcount()
//if the file is tab seperated
ls_data1 = lds_cons_buffer.getitemstring(li, 'v_data1')
ls_data2 = lds_cons_buffer.getitemstring(li, 'v_data2')
//if the file is not tab seperated but like this 533#0000000000007851....
if isnull(ls_data2) and Match(ls_data1, "#") then
ll_length = Len(ls_data1)
ll_length_left = Pos(ls_data1, "#") -1
ll_length_right = ll_length - Pos(ls_data1, "#")
ls_data1_temp = Left(ls_data1, ll_length_left)
ls_data2_temp =Right(ls_data1, ll_length_right)
ls_data1 = ls_data1_temp
ls_data2 = ls_data2_temp
end if
next
ImportFile 在简单性方面建议 win,但前提是您知道每行的最大长度,并且将整个文件加载到内存中两次(尽管这会忽略 DW/DS 上的磁盘存储选项) 不是问题。
为了最小的内存占用,我会考虑在源文件上使用 FileOpen/FileRead 函数,以 LineMode 读取文件,解析每一行(PFC 具有全局字符串替换功能),并将结果写入 FileWrite 到一个临时文件。然后,最后,将您的源重命名为 .BAK(或类似的东西......破坏某人的数据......)并将临时文件重命名为源文件的名称。
这个选项肯定是多劳多得,但又是另外一条上山路。你的地图越好,你到达那里的机会就越大。
我有一个简单的问题,但我现在很忙,我想知道是否有人可以帮助我,
我需要 PB 中的代码部分,它将覆盖 txt 文件并使其以制表符分隔。
考虑一个 insert.txt 文件,格式如下
533#0000000000007851
594#0000000000006937
36#0000000000005667
.....
我想用PB代码覆盖它,做成这样
533 0000000000007851
594 0000000000006937
36 0000000000005667
......
因此 # 将被删除并成为选项卡...
我希望你能理解这个问题
请帮我一些忙,任何帮助将不胜感激
提前致谢
我想我找到了方法,如果我错了请指正
- 使用 importfile 将所有数据插入到单个列中的数据存储中
- 逐行找到 # 并将其替换为制表符,然后将 2 个新值插入另一个 ds
- 导出文件
以上是否正确?
您的回答是正确的,但可以更简单。
1) 将文件导入为单列
2) 解析每行中的值以查找类似于此的“#”:
integer li
string ls_a, ls_b, ls_rowvalue
FOR li = 1 TO dw_import.Rowcount()
ls_rowvalue = dw_import.object.columnwithdata[li]
ls_a = Right(ls_rowvalue, Pos(ls_rowvalue, "#") - 1)
ls_b = Mid(ls_rowvalue, Pos(ls_rowvalue, "#") + 1)
//put the values into a new datawindow
NEXT
dw_newvalues.Saveas("C:\temp\newstuff.txt)
默认'saveas'类型是文本!这是制表符分隔的。
for li=1 to lds_cons_buffer.rowcount()
//if the file is tab seperated
ls_data1 = lds_cons_buffer.getitemstring(li, 'v_data1')
ls_data2 = lds_cons_buffer.getitemstring(li, 'v_data2')
//if the file is not tab seperated but like this 533#0000000000007851....
if isnull(ls_data2) and Match(ls_data1, "#") then
ll_length = Len(ls_data1)
ll_length_left = Pos(ls_data1, "#") -1
ll_length_right = ll_length - Pos(ls_data1, "#")
ls_data1_temp = Left(ls_data1, ll_length_left)
ls_data2_temp =Right(ls_data1, ll_length_right)
ls_data1 = ls_data1_temp
ls_data2 = ls_data2_temp
end if
next
ImportFile 在简单性方面建议 win,但前提是您知道每行的最大长度,并且将整个文件加载到内存中两次(尽管这会忽略 DW/DS 上的磁盘存储选项) 不是问题。
为了最小的内存占用,我会考虑在源文件上使用 FileOpen/FileRead 函数,以 LineMode 读取文件,解析每一行(PFC 具有全局字符串替换功能),并将结果写入 FileWrite 到一个临时文件。然后,最后,将您的源重命名为 .BAK(或类似的东西......破坏某人的数据......)并将临时文件重命名为源文件的名称。
这个选项肯定是多劳多得,但又是另外一条上山路。你的地图越好,你到达那里的机会就越大。