【问题标题】:How to convert text file into csv如何将文本文件转换为csv
【发布时间】:2019-04-22 15:40:35
【问题描述】:

我有一个固定列长度的输入文件,我需要将文件转换为 csv。

当前代码将其转换为 csv,但列会根据不同长度的空白进行偏移。

如何去掉多余的逗号使列数统一?

C#、Visual Studio 和 CSV

using System;
using System.IO;
using System.Linq;

namespace write_csv
{
    class Program
    {
        static void Main(string[] args)
        {

            string csvfilePath = @"C:\Users\ai_hacker\Desktop\output.csv";
            string[] lines = System.IO.File.ReadAllLines(@"C:\Users\ai_hacker\Desktop\orsc1827.ot2");

            foreach (string line in lines)
            {
                var parts = line.Split(' ');
                string csvLine = string.Join(',', parts);
                Console.WriteLine(csvLine);

                File.AppendAllText(csvfilePath, csvLine + Environment.NewLine);
            }


        }
    }
}

输入:

439790                6806991   4700       NORTH AMERICAN 04/18/19  08161895  P90947L6 - O076GG7F
91921221              6835746   1385       GALLAGHER POWER04/18/19  09024922  P90948G0 - O076GHAR

当前输出:

439790,,,,,,,,,,,,,,,,6806991,,,4700,,,,,,,NORTH,AMERICAN,04/18/19,,08161895,,P90947L6,-,O076GG7F
91921221,,,,,,,,,,,,,,6835746,,,1385,,,,,,,GALLAGHER,POWER04/18/19,,09024922,,P90948G0,-,O076GHAR

需要列对齐:

439790,6806991,4700,NORTH,AMERICAN,04/18/19,08161895,P90947L6,-,O076GG7F
91921221,6835746,1385,GALLAGHER,POWER04/18/19,09024922,P90948G0,-,O076GHAR

【问题讨论】:

  • 您能否添加输入数据的样本以及您期望的输出?
  • 看起来文件已经有逗号,所以它是 csv。这是输入还是输出?列 1 数据、列 2 数据等
  • ot2文件中的一些分隔符(在你的情况下为“空白”)分割值,然后用逗号加入
  • 不要用答案更新问题。至少在底部多做一个部分。
  • "两者都在控制台中提供了一个输出..." - 不,第一个片段完全写入控制台。您正在测试/寻找错误的方式。或者运行程序的旧副本。

标签: c# csv


【解决方案1】:

输入是空格分隔的txt,需要它的csv

foreach (string line in lines)
{
    var parts = line.Split(' ');
    string csvLine = string.Join(',', parts);
    Console.WriteLine(csvLine);
}

这是一个快速修复。对于“官方”csv,您需要考虑将 " 放在文本字段周围,从而区分文本和数字。

【讨论】:

  • 我收到一个错误“无法分配'line',因为它是'foreach 迭代变量'
  • @user9794893 - 是的,已编辑。你需要一个额外的字符串。
  • 谢谢,cmd控制台的输出没有显示逗号。我也需要它打印成 csv 文件
  • “不显示逗号”不清楚且不太可能。检查 WriteLine,它是否打印正确的字符串?
  • 如何检查 WriteLine?
【解决方案2】:

这项工作可以在一行中完成,无需显式循环

string csvfilePath = @"C:\Users\Desktop\ooutput.csv";
string[] lines = System.IO.File.ReadAllLines(@"C:\Users\Desktop\orsc1827.ot2");
var result = string.Join(Environment.NewLine, 
                    lines.Select(x => x.Split(' '))
                         .Select(x => string.Join(",", x)));
File.WriteAllText(csvfilePath, result);

使用样本输入

string input = @"
     1846223 6833581-1 75522 ADMC 04/17/19 09283609 P9093CC8 - O076FDE4
     1846201 6833581-1 75522 ADMC 04/17/19 09284581 P9093CC4 - O076FDE9";

我在结果字符串中得到了这个输出

1846223,6833581-1,75522,ADMC,04/17/19,09283609,P9093CC8,-,O076FDE4
1846201,6833581-1,75522,ADMC,04/17/19,09284581,P9093CC4,-,O076FDE9

如果你想把最后两个子串放在一起,那么你可以添加

var result = string.Join(Environment.NewLine, 
              lines.Select(x => x.Replace(" - ", "-")
                  .Split(' ')).Select(x => string.Join(",", x)));

如果数据之间有多个空格,则可以通过此更改删除多余的空格

var result = string.Join(Environment.NewLine,
          lines.Select(x => x.Replace(" - ", "-")
               .Split(new char[] { ' '}, StringSplitOptions.RemoveEmptyEntries))
               .Select(x => string.Join(",", x)));

【讨论】:

  • 谢谢,我仍然没有看到输出中的逗号
  • 我已经使用示例输入进行了测试,并且得到了预期的逗号。那么应该会有所不同
  • 错误:字符串[] 不包含“选择”的定义
  • 您需要在 .cs 文件的顶部添加 using Linq;
  • 它运行了,但没有创建 csv 文件
【解决方案3】:

如果您不确定一行中值之间的空格数,请试试这个。

RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);     

string csvline;
foreach (string line in lines)
{
    csvline = regex.Replace(line, ",");
    Console.WriteLine(csvline);
}

如果你确定你只有一个,你就可以

string csvline;
foreach (string csvline in lines){
        csvline = line.Replace(' ', ',');
        Console.WriteLine(csvline);
}

【讨论】:

  • 我收到一个错误“无法分配'line',因为它是'foreach 迭代变量'
  • 啊,对不起。您不能分配给迭代的变量。将其更改为 csvline
  • 我使用了第一个,并且正在 cmd 控制台中打印,但我没有看到逗号
  • 如何去掉列之间多余的逗号?列不对齐
【解决方案4】:

在这里很难准确说出您的要求,所以我的回答会很模糊。

对于分隔文件,您需要对某种值进行分隔,因此我将不得不对这些值是什么做出一些假设。 String.Join 函数可能就是您要在那里寻找的。它产生一个字符串输出,它是与指定分隔符连接的对象数组的乘积。 (例如 [1,2,3] => "1,2,3")

就将输出写入文件而言,您需要的功能类似于您用来读取文件的功能。 File 对象有一个 WriteAllText 函数,该函数将生成一个包含给定文本(作为字符串)的文本文件,或者 File.WriteAllLines 将产生类似的结果,但带有一个字符串数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2019-04-28
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多