在Excel和记事本中打开时,将数字格式化为CSV格式的文本

Mr *_*Neo 5 c# csv excel notepad++

我收到了将数据保存在CSV文件中并将其发送给客户的要求.客户使用Excel和记事本来查看此文件.数据看起来像:

975567EB,973456CE,971343C8

我的数据有一些数字以"E3"结尾,如:

98765E3

因此,当在Excel中打开时,它将更改为:

9.8765E + 7

我编写了一个程序,通过在C#中添加="98765E3"将此格式更改为文本

while(!sr.EndOfStream) {
     var line = sr.ReadLine();
     var values = line.Split(',');

     values[0] = "=" + "\"" + values[0] + "\""; //Change number format to string

     listA.Add(new string[] {values[0], values[1], values[2], values[3]});
}
Run Code Online (Sandbox Code Playgroud)

但对于使用记事本打开CSV文件的客户,它会显示如下:

= "98765E3"

如何将数字保存为CSV文本以在Excel和记事本中打开并获得相同的结果?非常感谢任何建议!

小智 4

\n

不要射杀信使。

\n
\n\n

您的问题不在于您在 C# 中导出(创建...?)数据的方式。这是您在 Excel 中打开 CSV 文件的方式。

\n\n

Excel 有许多用于导入文本文件的选项,这些选项允许使用FieldInfo参数,该参数为导入的数据的每个字段(也称为列)指定TextFileColumnDataTypes 属性。

\n\n

如果您选择从资源管理器文件夹窗口双击 CSV 文件,那么您将不得不忍受 Excel 的“最佳猜测”是您为每一列准备的字段类型。它不会在导入过程中途停止征求您的意见。一些常见错误包括:

\n\n
    \n
  • 带有 E 的字母数字值通常会被解释为科学记数法。
  • \n
  • 一半的 DMY 日期将被误解为错误的 MDY 日期(反之亦然)。另一半将变成文本,因为 Excel 无法将 14/08/2015 之类的内容处理为 MDY。
  • \n
  • 任何以 + 开头的值都会生成 #NAME!错误,因为 Excel 认为您正在尝试引入具有指定质量的公式。
  • \n
\n\n

这是常见错误的简短列表。还有其他的。以下是一些常见的解决方案。

\n\n
    \n
  • 使用数据 \xe2\x96\xba 从文本获取外部数据 \xe2\x96\xba。显式指定任何不明确的列数据类型;例如,98765E3 作为文本,日期为 DMY、MDY、YMD 等(视情况而定)。甚至可以选择丢弃一列无用的数据。
  • \n
  • 使用文件 \xe2\x96\xba 打开 \xe2\x96\xba 文本文件,这将带您完成与上述选项相同的导入向导。可以使用任一命令记录这些操作以便重复使用。
  • \n
  • 使用 VBA 的Workbooks.OpenText 方法并指定每列的FieldInfo位置和数据类型(后者带有XlColumnDataType常量)。
  • \n
  • 将导入文件读入内存并在内存数组中对其进行处理,然后将其转储到目标工作表中。
  • \n
\n\n

有一些不太精确的解决方案仍然需要 Excel 的一些解释。

\n\n
    \n
  • 使用Range.PrefixCharacter强制将带有前导零或字母数字值的数字(可能会被误解为科学记数法)作为文本输入到工作表中。
  • \n
  • 使用文本限定符;通常使用 ASCII 字符 034(例如")来包装您想要解释为文本的值。
  • \n
  • 将整个文本文件复制并粘贴到目标工作表的 A 列中,然后使用Range.TextToColumns 方法(同样使用每列可用的 FieldInfo 选项)。
  • \n
\n\n

后两种方法会在记事本中产生一些奇怪的值,但记事本不是 Excel,无法在几秒钟内处理 50 万次计算和其他操作。如果您必须将这两个程序混搭在一起,就会有一些妥协。

\n\n

我的建议是在记事本中尽可能保留这些值,并使用 Excel 中现成的工具和流程来正确导入数据。

\n