我想创建一个经典的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)。
我希望有人可以提供帮助。
答案 0 :(得分:4)
从根本上说,这很难做到,因为你无法判断回车是否有效。显然,20
和30
之后的有效。
我将尝试扫描文件中的每一行并计算发生的逗号。如果它小于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
当然这将删除此字符串中的所有新行字符。好好使用。