【问题标题】:Write Tab Delimited File写入制表符分隔文件
【发布时间】:2023-03-10 00:26:01
【问题描述】:

我在编写制表符分隔的文件时遇到问题,我已经检查了这里,但还没有得到答案。

所以我有一个函数可以返回带有以下重要部分的字符串(使用的分隔符以及我如何构建每一行):

var delimiter = @"\t";
sb.Append(string.Join(delimiter, itemContent));
sb.Append(Environment.NewLine);

返回的字符串是这样的:

H\t13\t170000000000001\t20150630
D\t1050\t10.0000\tY
D\t1050\t5.0000\tN

然后我把它写到一个文件中(下面的内容是上面的字符串):

var content = BuildFile(item);
var filePath = tempDirectory + fileName;

// Create the File
using (FileStream fs = File.Create(filePath))
{
    Byte[] info = new UTF8Encoding(true).GetBytes(content);
    fs.Write(info, 0, info.Length);
}

但是,文件输出是没有标签的(在记事本++中打开):

H\t13\t170000000000005\t20150630
D\t1050\t20.0000\tN
D\t1050\t2.5000\tY

什么时候应该更像这样(提供示例文件):

H   100115980   300010000000003 20150625
D   430181  1   N
D   342130  2   N
D   459961  1   N

这可能是我使用的编码造成的吗?感谢您的任何意见,谢谢!

【问题讨论】:

  • @OgnyanDimitrov 不是真的,这本质上是关于字符串和 C# 语法的问题
  • 如果您接受添加对Microsoft.VisualBasic的引用,您也可以使用ControlChars.Tab (sb.Append(string.Join(ControlChars.Tab, itemContent));)
  • 使用Path.Combine(tempDirectory, fileName);

标签: c# file csv


【解决方案1】:

您的代码中有错字。 @ 前缀表示后面的字符串是一个字面量,所以@"\t" 是一个由\t 两个字符组成的字符串

您应该使用不带前缀的“\t”。

您应该考虑使用StreamWriter,而不是在内存中构造整个字符串并写入原始字节。 StreamWriter 默认使用 UTF-8,允许您像使用 Console.WriteLine 一样编写格式化的行:

var delimiter ="\t";

using(var writer=new StreamWriter(filePath))
{
    var line=string.Join(delimiter, itemContent);
    writer.WriteLine(line);
}

【讨论】:

    【解决方案2】:

    使用var delimiter = @"\t";,变量包含文字\ 加上t。 @ 语法将反斜杠禁用为“特殊”。在这种情况下你真的想要

    var delimiter = "\t";
    

    有一个制表符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2013-05-22
      • 2018-11-04
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多