使用经典asp(vbscript)从csv字符串中删除不需要的chr(13)

时间:2011-05-27 10:45:50

标签: csv asp-classic vbscript replace

我想创建一个经典的asp(vbscript)函数来替换双引号之间发生的所有“返回”。

输入字符串是'csv',如:

ID;Text;Number
1;some text;20
2;"some text with unwanted return
";30
3;some text again;40

我想在chr(13)上拆分字符串(返回)以在数组中创建单行。它运行良好,除了id 2文本中包含的不需要的chr(13)。

我希望有人可以提供帮助。

4 个答案:

答案 0 :(得分:4)

从根本上说,这很难做到,因为你无法判断回车是否有效。显然,2030之后的有效。

我将尝试扫描文件中的每一行并计算发生的逗号。如果它小于3,则追加下一行并使用连接字符串。 (这当然假设您的CSV结构是一致且固定的。)

我真正要问的是为什么CSV首先是这样的?填充它的例程应该是剥离CR的那个。

将CSV文件想象成非常粗糙的数据库或电子表格。在考虑上述文件时,很明显“数据库”/“电子表格”已损坏。

如果生成此程序的程序正在对其进行校正,那么阅读应用程序应该在多大程度上纠正这些缺陷?我不确定Excel或SQL Server(例如)是否会竭尽全力纠正损坏的数据源。

答案 1 :(得分:1)

您的文本文件就像一个CSV文件,但是用分号不是逗号。使用ADO来获取数据,它将处理字段中的换行符。

具体(在ASP VBScript中):

On Error Resume Next
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001

Set objConnection = Server.CreateObject("ADODB.Connection")
Set objRecordSet = Server.CreateObject("ADODB.Recordset")

strPathtoTextFile = server.mappath(".")   'Path to your text file

objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
         "Data Source=" & strPathtoTextFile & ";" & _
         "Extended Properties=""text;HDR=YES;FMT=Delimited"""

objRecordset.Open "SELECT * FROM test.txt", _
         objConnection, adOpenStatic, adLockOptimistic, adCmdText

Do Until objRecordset.EOF
    Response.Write "ID: " & objRecordset.Fields.Item("ID") & "<br>"
    Response.Write "Text: " & objRecordset.Fields.Item("Text") & "<br>"
    Response.Write "Number: " & objRecordset.Fields.Item("Number") & "<br>"
    objRecordset.MoveNext
Loop

代码示例已从Microsofts' Much ADO About Text Files修改。

此脚本假定您的数据文本文件与它(asp文件)位于同一目录中。它还需要一个schema.ini文件与数据文本文件位于同一目录中:

[test.txt]
Format=Delimited(;)

将上面两个代码示例中的text.txt更改为文本文件的名称。

答案 2 :(得分:0)

如果不需要的CRLF总是出现在文本字段内(双引号内),则使用正则表达式删除它们并不是非常困难。 Vbscript有一个正则表达式引擎可供使用:http://authors.aspalliance.com/brettb/VBScriptRegularExpressions.asp 这一切都取决于您对正则表达式的熟悉程度。我无法想到正确的语法,但这可能很容易理解。

答案 3 :(得分:0)

解决方案非常简单:

str = "Some text..." & chr(13)
str = REPLACE(str,VbCrlf,"")

秘密是使用VbCrlf。对我来说,我使用一个简单的函数来解决问题,并在我的框架中添加它。

FUNCTION performStringTreatmentRemoveNewLineChar(byval str)

    IF isNull(str) THEN
        str = ""
    END IF
    str = REPLACE(str,VbCrlf,"")
    performStringTreatmentRemoveNewLineChar = TRIM(str)

END FUNCTION

当然这将删除此字符串中的所有新行字符。好好使用。