2016-01-28 8 views
0

Я пытаюсь написать CSV-файл с переменным форматом вывода.NET stream writer Переменный формат

Код

fs.WriteLine(String.Format(format, 
          data(0), 
          data(1), 
          data(2), 
          data(3), 
          data(4), 
          data(5) 
          ) 
      ) 

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

data(0), 
data(1), 
data(2), 
data(3), 
data(4), 
data(5) 

в строке

str = "data(3) , data(2) , data(1) , data(0)" 
fs.WriteLine(String.Format(format, str)) 

Я получаю ошибку

Индекс (основанный на нуле) должен быть больше или равен нулю и меньше, чем размер списка аргументов.

Что я делаю неправильно?

+0

Потому что во втором вызове вы передаете два параметра методу. Но в первом вы проходите 6 параметров. И string.format рассматривает каждый параметр как отдельную переменную в строке 'format' –

+0

, почему вы все равно хотите это сделать? – Carsten

ответ

4

Это символьная строка:

str = "data(3) , data(2) , data(1) , data(0)" 

что вы хотите это массив строк, как это:

str = {data(3), data(2), data(1), data(0)} 

Примечание: Вы должны изменить свою декларацию str от того, чтобы быть Строка быть массив строк, а из:

Dim str As String 

в

Dim str As String() 

Однако

Если вы просто иметь кучу переменных выписывать в CSV вы можете сделать это легко, как это:

Using sr As New StreamWriter(filename) 
     Dim sb As New StringBuilder 
     For Each value In data 
      sb.Append(value & ",") 
     Next 
     sr.WriteLine(sb.ToString.TrimEnd(","c)) 
    End Using 
1

Если вы пытаетесь записать эти данные элементы из в порядке:

`data(3), data(2), data(1), data(0)` 

Тогда ваш формат аргумент должен быть:

format = "{3}, {2}, {1}, {0}" 
' when used: 

fs.WriteLine(String.Format(format, 
         data(0), 
         data(1), 
         data(2), 
         data(3), 
         data(4), 
         data(5) 
         ) 
     ) 

Это будет выписывать все, что передается в качестве 4-го аргумента (data(3)) в качестве первого элемента в outout. Второй элемент на выходе будет третьим аргументом или data(2).


Основываясь на предыдущем вопросе, похоже, что вы пытаетесь изменить/управлять порядком обоих заполнителей в formatи порядок, что data() элементы указаны. Это не работает, и вам не нужно.

Поскольку оба заполнители в строке формата и массив данных равны нулю на основе, {0} =>data(0), {1} =>data(1) и так далее. Таким образом, все, что вам нужно сделать, это изменить порядок заполнения в строке формата {n}.Оставьте только data(n) обозначения и заказ.

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

+0

Просто потому, что я люблю интерполяцию строк в новых языковых версиях: 'sf.WriteLine ($" {data (3)}, {data (2)}, {data (1)}, {data (0)} ")' , –

+0

, но ему/ей необходимо каждый раз записывать данные в другом порядке. есть справедливая сумма, которую ОП не прояснил здесь – Plutonix

+1

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