2016-03-14 4 views
0

Я пытаюсь написать строку в CSV-файл, но не могу ее отобразить. Мне удалось сделать это в VBA, но при записи на VB.net он не работает.Запись строки в новый .csv в VB.net

Сначала я создаю файл и устанавливаю заголовки для каждого столбца. После этого я получаю информацию о каждом обязательном атрибуте и записываю его в строку s. Все, что я хочу сделать, это написать строку в CSV-файл, чтобы каждый атрибут находился в правом столбце под правильным заголовком. Каждый раз, когда строка s просто должна быть в новой строке.

Это то, что у меня есть до сих пор (я вырезал некоторые фрагменты кода, поэтому некоторые синтаксисы могут выглядеть некорректно). Что я делаю неправильно или не хватает?

Sub Main() 
    Dim sOutput As String 
    ' Create a header for the output file 
    sOutput = ("Level,Occurrence Name,Reference Name,Object type, Visibility, Path" & vbLf) 

      If Occs.Count > 0 Then 
     For i = 1 To Occs.Count 
      iLevel = 0 
      curOcc = Occs.Item(i) 
      GetOccurrenceData(curOcc, sOutput, oSel, False, iLevel) 
     Next 
    End If 

    ' Write the output string to a file 
    Dim sPath As String 
    Dim bWrite As Boolean 
    sPath = ("C:\temp\data3.csv") 
    bWrite = WriteFile(sPath, sOutput) 
End Sub 


Sub GetOccurrenceData(curOcc As VPMOccurrence, s As String, sel As Selection, ByVal bParentHidden As Boolean, ByVal iParentLevel As Integer) 
'CODE TO GET DATA REMOVED AS IRRELEVANT 

    ' Append the output string with the data for the current occurrence. 
    s = (s & curLevel & "," & sName & "," & sRefName & "," & sType & "," & sVisibility & vbLf) 

    ' Repeat this data gathering procedure on any children the current occurrence may have. 
    Occs = curOcc.Occurrences 
    If Occs.Count > 0 Then 
     For i = 1 To Occs.Count 
      GetOccurrenceData(Occs.Item(i), s, sel, bChildrenInheritNoShow, curLevel) 
     Next 
    End If 
+0

Показать функцию "WriteFile". – PKatona

+0

Существует много возможностей для улучшения. Вместо того, чтобы пытаться сделать одну длинную строку, было бы быстрее создать List (String), где каждый элемент является строкой. 'GetOccurrenceData' может быть функцией, возвращающей строку за раз, или просто добавлением в список. Есть лучшие способы форматирования вывода – Plutonix

+0

Я добавил пример версии вашего кода в StringBuilder в моем ответе ниже, что-то конкатенирующее множество строк, StringBuilder более эффективен и чист. –

ответ

0

В GetOccurrenceData вы передаете в строку и изменить его в методе, но не передать его в качестве ByRef так что делается для строки в методе остается в методе.

Изменить заголовок вашего метода читать

Sub GetOccurrenceData(curOcc As VPMOccurrence,ByRef s As String, sel As Selection, ByVal bParentHidden As Boolean, ByVal iParentLevel As Integer) 

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

Like This:

Sub Main() 

    Dim sb As New Text.StringBuilder() 
    sb.AppendLine("Level,Occurrence Name,Reference Name,Object type, Visibility, Path") 

    If Occs.Count > 0 Then 
     For i = 1 To Occs.Count 
      iLevel = 0 
      curOcc = Occs.Item(i) 
      GetOccurrenceData(curOcc, sb, oSel, False, iLevel) 
     Next 
    End If 

    ' Write the output string to a file 
    Dim sPath As String 
    Dim bWrite As Boolean 
    sPath = ("C:\temp\data3.csv") 
    bWrite = WriteFile(sPath, sb.ToString()) 

End Sub 


Sub GetOccurrenceData(curOcc As VPMOccurrence, sb As Text.StringBuilder, sel As Selection, ByVal bParentHidden As Boolean, ByVal iParentLevel As Integer) 
    'CODE TO GET DATA REMOVED AS IRRELEVANT 

    ' Append the output string with the data for the current occurrence. 
    sb.Append(curLevel).Append(",").Append(sName).Append(",").Append(sRefName).Append(",").Append(sType).Append(",").AppendLine(sVisibility) 

    ' Repeat this data gathering procedure on any children the current occurrence may have. 
    Occs = curOcc.Occurrences 
    If Occs.Count > 0 Then 
     For i = 1 To Occs.Count 
      GetOccurrenceData(Occs.Item(i), sb, sel, bChildrenInheritNoShow, curLevel) 
     Next 
    End If 
End Sub 
+0

Удивительно, я потратил почти весь день, пытаясь разобраться в этом, и все, что мне нужно было сделать, это добавить «ByRef», чтобы все это волшебным образом работало. Благодаря! – JS16

+0

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

Смежные вопросы