удалить ненужные chr (13) из строки csv с классическим asp (vbscript) - PullRequest
3 голосов
/ 27 мая 2011

Я хочу создать классическую функцию asp (vbscript), которая заменяет все «возвраты», возникающие между двойными кавычками.

Строка ввода 'csv' похожа на:

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

Я хочу разбить строку на chr (13) (возвращает), чтобы создать отдельные строки в массиве. Он работает хорошо, за исключением нежелательного chr (13), который содержится в тексте id 2.

Я надеюсь, что кто-то может помочь.

Ответы [ 4 ]

4 голосов
/ 27 мая 2011

По сути, это будет трудно сделать, так как вы не сможете определить, является ли возврат каретки верным или нет.Очевидно, что те, которые указаны после 20 и 30, действительны.

Подход, который я бы использовал, - сканировать каждую строку в файле и считать запятые.Если оно меньше 3, добавьте следующую строку и используйте объединенную строку.(Это, конечно, предполагает, что ваша структура CSV последовательна и фиксирована).

Что я действительно хотел бы спросить здесь, так почему CSV такой, как этот?Процедура, которая заполняет это, должна действительно исключать CR.

Думайте о файле CSV как о очень сырой базе данных или электронной таблице.При рассмотрении вышеуказанного файла становится ясно, что «База данных» / «Электронная таблица» повреждена.

Если программа, которая генерирует это, исправляет это, то в какой степени приложение чтения должно пойти, чтобы исправить эти дефекты?Я не уверен, что Excel или SQL Server (например) пойдут на многое, чтобы исправить поврежденный источник данных.

1 голос
/ 31 мая 2011

Ваш текстовый файл похож на 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

Образец кода изменен из Много ADO для MicrosoftО текстовых файлах .

Этот сценарий предполагает, что ваш текстовый файл данных находится в том же каталоге, что и он (файл asp).Ему также нужен файл schema.ini в том же каталоге, что и ваш текстовый файл с данными:

[test.txt]
Format=Delimited(;)

Измените text.txt в обоих приведенных выше примерах кода на имя вашего текстового файла.

0 голосов
/ 02 августа 2012

Решение довольно простое:

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

Конечно, это удалит все символы новой строки из этой строки.Используйте осторожно.

0 голосов
/ 29 мая 2011

Если нежелательный CRLF всегда возникает внутри текстового поля (внутри двойных кавычек), не составит труда использовать регулярное выражение для их удаления. Vbscript имеет в своем распоряжении движок регулярных выражений: http://authors.aspalliance.com/brettb/VBScriptRegularExpressions.asp Все зависит от того, насколько вы знакомы с регулярными выражениями. Я не мог придумать правильный синтаксис на макушке головы, но это, вероятно, довольно легко понять.

...