Написание CSV с кавычками для соответствия исходному файлу - с использованием VB.net и TextfieldParser - PullRequest
0 голосов
/ 28 июня 2018

Извините, очень случайный программист, не программировался много лет .. (в основном в VB6) Я гуглил и читал .net детали по каждому классу файлов, видел много примеров, но не знаю, как получить модифицированный вывод для соответствия форматированию исходного кода.

У меня есть существующий файл: (это 2 строки файла: заголовок и 1 деталь)

"BATCHNBR","JOURNALID","TRANSNBR","DESCOMP","ROUTE","ACCTID","COMPANYID","TRANSAMT","TRANSQTY","SCURNDEC","SCURNAMT","HCURNCODE","RATETYPE","SCURNCODE","RATEDATE","CONVRATE","RATESPREAD","DATEMTCHCD","RATEOPER","TRANSDESC","TRANSREF","TRANSDATE","SRCELDGR","SRCETYPE","COMMENT","VALUES","PROCESSCMD"
"000004","00001","0000000020","",0,"60000000000000000ZZZZZ","GMN",817.31,0,"2",817.31,"USD","SP","USD",20180511,1,0,"1","1","100123","10444-Kampwerth, Brooke E",20180511,"UP","SC","",0,0

У меня есть подполнота, но она выводит каждое поле на отдельной строке и без двойных кавычек. TextFieldParser не имеет методов записи. Врезка msgbox показывает, что я правильно заменил данные,

Я усекаю определенное поле (если требуется), и врезки msgbox указывают, что я правильно заменил данные.

Мне просто нужно вывести в той же строке, что и источник.

Private Sub cmdProcess_Click(sender As Object, e As EventArgs) Handles cmdProcess.Click


    Using sw = New IO.StreamWriter(NewFile)
        Using MyReader As New FileIO.TextFieldParser(oFile)

            MyReader.TextFieldType = FileIO.FieldType.Delimited
            MyReader.SetDelimiters(",")
            'MyReader.HasFieldsEnclosedInQuotes

            'Dim Expression As String
            Dim Replacement As String

            Dim currentRow As String()
            While Not MyReader.EndOfData
                Try
                    currentRow = MyReader.ReadFields()
                    Dim currentField As String
                    For Each currentField In currentRow
                        If Strings.Right(currentField, 3) = "ZZZ" Then
                            'MsgBox(MyReader.LineNumber & " " & currentField)
                            Replacement = Strings.Left(currentField, 6)
                            'MsgBox(MyReader.LineNumber & " " & Replacement)
                            currentField = Replacement
                        End If
                        sw.WriteLine(String.Join(",", currentField))
                    Next
                Catch ex As Microsoft.VisualBasic.
                            FileIO.MalformedLineException
                    MsgBox("Line " & ex.Message &
                    "is not valid and will be skipped.")
                End Try
            End While
        End Using
    End Using
    MsgBox("Done")
    Dispose()

    Application.Exit()
End Sub

Если я заменю поле current на currentrow в sw.writeline, оно выводит ту же строку 27 раз (27 строк в источнике), затем выполняет следующую строку. И без двойных кавычек вокруг каждого поля.

Токовый выход: (с одним интервалом)

BATCHNBR

JOURNALID

TRANSNBR

DESCOMP

ROUTE

Чего мне не хватает .. ??

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Mary

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

Мне нужно было поменять местами список, и список очистить ... но это дало мне именно то, что мне нужно было, СПАСИБО !!!

               Dim Replacement As String
            Dim lstRow As New List(Of String)
            Dim currentRow As String()
            While Not MyReader.EndOfData
                Try
                    currentRow = MyReader.ReadFields()
                    Dim currentField As String
                    For Each currentField In currentRow
                        If Strings.Right(currentField, 3) = "ZZZ" Then
                            'MsgBox(MyReader.LineNumber & " " & currentField)
                            Replacement = Strings.Left(currentField, 6)
                            'MsgBox(MyReader.LineNumber & " " & Replacement)
                            currentField = Replacement
                        End If
                        lstRow.Add(currentField)
                    Next
                    sw.WriteLine(String.Join(",", lstRow))
                    lstRow.Clear()
                Catch ex As Microsoft.VisualBasic.
                            FileIO.MalformedLineException
                    MsgBox("Line " & ex.Message &
                    "is not valid and will be skipped.")
                End Try
0 голосов
/ 28 июня 2018

Вам нужно переместить WriteLine за пределы цикла For ... Next, чтобы он записывал только одну строку на строку. Я использовал список для накопления строк в каждой строке. Список используется в Join.

Dim lstRow as New List(Of String)
 For Each currentField In currentRow

        If Strings.Right(currentField, 3) = "ZZZ" Then
            'MsgBox(MyReader.LineNumber & " " & currentField)
            Replacement = Strings.Left(currentField, 6)
            'MsgBox(MyReader.LineNumber & " " & Replacement)
            currentField = Replacement
        End If
        lstRow.Add(currentField)
    Next
    sw.WriteLine(String.Join(",", lstRow))
    lstRow.Clear()
...