【问题标题】:.NET stream writer Variable format.NET 流编写器 变量格式
【发布时间】:2016-05-05 22:23:18
【问题描述】:

我正在尝试编写具有可变输出格式的 CSV 文件。

代码是

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))

我收到一个错误

索引(从零开始)必须大于或等于零且小于参数列表的大小。

我做错了什么?

【问题讨论】:

  • 因为在第二次调用中,您将两个参数传递给方法。但是在第一个中,您传递了 6 个参数。 string.format 将每个参数视为format 字符串中的单独变量
  • 你为什么要这样做?

标签: .net arrays vb.net streamwriter string.format


【解决方案1】:

这是一个文字字符串:

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

【讨论】:

    【解决方案2】:

    如果您尝试按以下顺序写出这些数据元素:

     `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 演示了这个概念。数据项保持相同的顺序,只是根据需要使用不同的格式字符串。

    【讨论】:

    • 只是因为我喜欢新语言版本中的字符串插值:sf.WriteLine($"{data(3)}, {data(2)}, {data(1)}, {data(0)}").
    • 但是他/她每次都需要以不同的顺序写出数据。 OP在这里没有明确说明的数量相当多
    • 没错,在这种情况下,您的示例显然更实用。这是我见过的少数几个例子之一,其中长形式的 String.Format 比插值版本更实用且更易于使用。我只是想展示其他选项。
    • @Plutonix - 感谢您的回复,还有一个警告,列数也是可变的。所以 data(0), data(1) 字符串需要改变吗?
    • ` data(0), data(1)...` 不是字符串。它不能是字符串。它是对您读入的 CSV 数据的代码引用。这旨在将一个输入 CSV“映射”到许多不同的输出顺序,就像在原始问题中一样。由于它是由创建的格式字符串驱动的,它仍然可以处理多列计数。但是如果有许多不同的输入计数,我可能会采取不同的做法以避免配置文件拼写错误造成异常。
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 2019-11-06
    相关资源
    最近更新 更多