Замена структуры возможно комплексное решение RegexReplace? - PullRequest
1 голос
/ 29 октября 2019

Мне нужно запустить VBScript, который меняет структуру файла CSV. Для простоты я использую только 3 поля данных, но их гораздо больше. В производственной среде у меня будет CSV-файл с сотнями строк.

Проблема в том, что все в двойных кавычках. Конечным результатом иногда может быть отсутствие кавычек или одиночных кавычек, а иногда и смесь всех трех.

Я абсолютно не представляю, как мне к этому подходить, и искал какое-то руководство. Это похоже на работу для RegexReplace, но из-за того, что он смешанный, я не уверен, как начать это. После того, как файл был изменен, я должен перевернуть исходный файл.

CSV Пример: "Яблоко", "12"; "хуг""Somereallylongword", "7687", "theredfox"

Узор "% 1";% 2; '% 3'

Желаемый результат "Яблоко"; 12; 'хуг'"somereallylongword"; 7687; 'theredfox'

То, чего я пытаюсь добиться, - это создать новый тип шаблона. В моем примере:«% 1» - я сохраняю оригинальные двойные кавычки. % 2 - Удалить двойные кавычки. «% 3» - заменить двойные кавычки одинарными.

Любое понимание будет с благодарностью.

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Просто попробуйте этот код, заменив путь к вашему CSV-файлу, и скажите, как он работает на вашей стороне?

Option Explicit
Dim Data
Call ForceCScriptExecution()
Data = ReadFile("C:\Test\Test.csv")
wscript.echo "Before Replacing"
wscript.echo String(50,"-")
wscript.echo Data
wscript.echo String(50,"-")
wscript.echo "After Replacing"
wscript.echo String(50,"-")
wscript.echo Search_Replace(Data)
wscript.echo String(50,"-")
wscript.sleep 20000
'-----------------------------------------------
Function Search_Replace(Data)
    Dim oRegExp,strPattern1,strPattern2
    Dim strReplace1,strReplace2,strResult1,strResult2
    strPattern1 = ";(\x22)(\S+\w+)(\x22);"
    strReplace1 = ";$2;"
    strPattern2 = "[;]\x22([^\x22]+)\x22"
    strReplace2 = ";'$1'"
    Set oRegExp = New RegExp
    oRegExp.Global = True 
    oRegExp.IgnoreCase = True 
    oRegExp.Pattern = strPattern1
    strResult1 = oRegExp.Replace(Data,strReplace1)
    oRegExp.Pattern = strPattern2
    strResult2 = oRegExp.Replace(strResult1,strReplace2)
    Search_Replace = strResult2
End Function
'-----------------------------------------------
Function ReadFile(path)
    Const ForReading = 1
    Dim objFSO,objFile
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(path,ForReading)
    ReadFile = objFile.ReadAll
    objFile.Close
End Function
'----------------------------------------------
Sub ForceCScriptExecution()
    Dim Arg, Str, cmd, Title
    Title = "Search and Replace using RegExp by Hackoo 2019"
    cmd = "CMD /C Title " & Title &" & color 0A & Mode 80,30 & "
    If Not LCase( Right( WScript.FullName, 12 ) ) = "\cscript.exe" Then
        For Each Arg In WScript.Arguments
            If InStr( Arg, " " ) Then Arg = """" & Arg & """"
            Str = Str & " " & Arg
        Next
        CreateObject( "WScript.Shell" ).Run _
        cmd & "cscript //nologo """ & _
        WScript.ScriptFullName & _
        """ " & Str
        WScript.Quit
    End If
End Sub
'-----------------------------------------------

Редактировать: Код пакетного сценария

Вы можете сделать это легко с помощью пакетного сценария, не используя Regex:

@echo off
Title Edit CSV File
Set "Input_CSV_File=C:\Test\Test.csv"
Set "OutPut_CSV_File=C:\Test\OutPut_Test.csv"
If Exist "%OutPut_CSV_File%" Del "%OutPut_CSV_File%"
@for /f "tokens=1,2,3 delims=;" %%a in ('Type "%Input_CSV_File%"') Do (
    echo "%%~a";%%~b;'%%~c' 
    echo "%%~a";%%~b;'%%~c'>>"%OutPut_CSV_File%"
)
TimeOut /T 5 /NoBreak>nul
If Exist "%OutPut_CSV_File%" Notepad "%OutPut_CSV_File%" & Exit
0 голосов
/ 29 октября 2019

Вы можете прочитать файл CSV, используя ADODB:

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1

Dim objConnection
Dim objRecordset
Dim sCSVFolder
Dim sCSVFile
Dim sValue

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordset = CreateObject("ADODB.Recordset")

sCSVFolder = "C:\CSV_Folder\"
sCSVFile = "your_csv_file.csv"

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

objRecordset.Open "SELECT * FROM " & sCSVFile, _
          objConnection, adOpenStatic, adLockOptimistic, adCmdText

Do Until objRecordset.EOF
    ' Modify and write fields to new text file here
    sValue = objRecordset.Fields.Item("FieldName")
    objRecordset.MoveNext
Loop

Таким образом, вы позволите ADO обрабатывать чтение данных и удалять двойные кавычки, и вы можете легко манипулировать данными как набором записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...