换行被字符串代替



我试图将字符串从变量附加到CSV中的行结束。但是,换行将被字符串替换。如果原始行是:

fieldcharacters1,fieldcharacters string从一行开始

并在换行后继续,fieldcharacters3

(其中空白行为换行)

和我想要附加"fieldcharacter4"(不带引号)到行尾,它应该显示如下:

fieldcharacters1,fieldcharacters string从一行开始

并在换行、fieldcharacters3、fieldcharacter4

之后继续

但是结果是这样的:

fieldcharacters1,fieldcharacters string从1开始Line,fieldcharacter4,fieldcharacter4,并在一行之后继续喂,fieldcharacters3, fieldcharacter4

这是我的代码。我还尝试了使用objCurrentFile.AtEndOfStream的Do Until循环,但它也不起作用。

Set tsOut = objFSO.CreateTextFile(strCSV, FOR_WRITING)
strLine = objCurrentFile.ReadAll
objCurrentFile.close
strInsertText = ",testing123123" & chr(013)
WScript.Echo "Text to be appended= " & strInsertText
strNewText = Replace(strLine, Chr(013), strInsertText )
tsOut.Write strNewText

有三个行尾标记:

  1. 换行| vbLf |杆(10)|/n
  2. CarriageReturn | vbCr |杆(13)|/r
  3. CarriageReturn +换行| vbCrLf |杆(13),杆(10)|/r/n

从文件中读取时,.ReadLine()会删除/n或/r/n,但不会删除/r(见这里);然而,. readline()将返回文件的所有内容。

你的问题的一个简单模型:你有一个。csv包含嵌入r's和rn作为eol的字段;当试图通过Replace将字符串从变量附加到行尾时,嵌入的r也会受到影响:

>> sLine = "field 1,... one linerand ...field 3rn"
>> WScript.Echo Replace(sLine, "r", "[,append]")
>>
field 1,... one line[,append]and ...field 3[,append]n

你可以替换rn:

>> WScript.Echo Replace(sLine, "rn", "[,append]")
>>
field 1,... one linerand ...field 3[,append]

并处理最终替换文件中尾随的rn。如果您可以遍历。csv行,则追加/连接(而不是使用。replace)额外的数据和适当的eol标记(可能通过。writeline)。

如果eol和嵌入的标记相同,第一种方法将失败。在这种情况下(可能在一般情况下)使用ADO文本驱动程序来处理。csv是一个更好的选择。

(顺便说一句:阅读文档了解为什么

objFSO.CreateTextFile(strCSV, FOR_WRITING)

是错误的)

更新wrt注释:

从你的评论中我得出结论,你的。csv使用rn作为eol 嵌入(段落?)标记。所以Replace不能工作:

>> sLine = "field 1,... one linernand ...field 3rn"
>> WScript.Echo Replace(sLine, "rn", "[,append]")
>>
field 1,... one line[,append]and ...field 3[,append]

当使用。readline()时,您还必须期望在嵌入的rn处终止'短行'。所以你的选项是:

  1. 与。csv的创建者交谈,并要求她为嵌入标记和eol标记使用不同的标记。然后你可以使用Replace(.ReadAll(), eol, extra &如果您处理了上面提到的"最后(空)行上的虚假替换"。
  2. 根据。csv的格式/布局/内容——带引号的字符串、嵌入(带引号的)字段的字段分隔符、数据类型、行长度、rn在一行中的位置——你可以编写一个自定义的RegExp替换函数或一个成熟的解析器来完成这项工作(参见这里)。为了帮助你,我需要一个像样的描述。csv(想想schema.ini)和代表性的样本数据。
  3. 使用ADO文本驱动程序(从这里开始你的研究,但不要停在那里)。风险:我不确定驱动程序是否可以处理(错误)使用嵌入的eol标记。

大致思路:

在简短地查看了示例数据之后,我可以确认rn在一些引用字段中用于eol 段落。第一个测试表明,ADO文本驱动程序可以处理这个问题。

但是因为第一个字段包含带引号的IP地址,所以您可以区分eol (rn后面跟着"(或"IP地址"))和paragraph (rn 不是后面跟着"(或"IP地址"))。如果"分段"字段中没有",则在.ReadAll上简单地替换"rn"即可解决问题;否则需要一个引用IP地址的RegExp。

演示代码:

Option Explicit
Dim sCsv : sCsv = Replace(Join(Array( _
     "'1.2.3.4','line1rnline2',1,'whatever'" _
   , "'5.6.7.8','linearnlineb',2,'pipapopu'" _
   , "" _
), "eol"), "'", """")
WScript.Echo "faked .CSV (embedded rr, EOL rn)"
WScript.Echo Replace(sCsv, "eol", "rn" & vbCrLf) ' for display
sCsv = Replace(Replace(sCsv, "eol", vbCrLf), "rn", vbCrLf) ' 'real data'
WScript.Echo "raw display of .CSV"
WScript.Echo sCsv
If False Then
  Dim re : Set re = New RegExp
  re.Global = True
  re.Pattern = "(rn""d+(.d+){3}"")" ' EOL followed by "IP Address" of next line
  ' dirty hack to append to last line
  sCsv = sCsv & """0.0.0.0"""
  sCsv = re.Replace(sCsv, ",""append""$1")
  ' remove trailing junk (rn"IP Address")
  sCsv = Left(sCsv, Len(sCsv) - 11)
Else
  ' dirty hack to append to last line
  sCsv = sCsv & """"
  sCsv = Replace(sCsv, vbCrLf & """", ",""append""" & vbCrLf & """")
  ' remove trailing junk (rn")
  sCsv = Left(sCsv, Len(sCsv) - 3)
End If
WScript.Echo "raw display of .CSV after appending"
WScript.Echo sCsv

输出(两种方法):

cscript 24673618.vbs
faked .CSV (embedded rr, EOL rn)
"1.2.3.4","line1rnline2",1,"whatever"rn
"5.6.7.8","linearnlineb",2,"pipapopu"rn
raw display of .CSV
"1.2.3.4","line1
line2",1,"whatever"
"5.6.7.8","linea
lineb",2,"pipapopu"
raw display of .CSV after appending
"1.2.3.4","line1
line2",1,"whatever","append"
"5.6.7.8","linea
lineb",2,"pipapopu","append"

最新更新