如何将文本文件转换为csv

时间:2019-04-22 15:40:36

标签: c# csv

我有一个固定列长的输入文件,我需要将文件转换为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

4 个答案:

答案 0 :(得分:4)

  

输入内容以txt分隔,需要csv

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

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

答案 1 :(得分: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)));

答案 2 :(得分:1)

如果不确定行中值之间的空格数,请尝试此操作。

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

答案 3 :(得分:0)

在这里很难确切地知道您的要求,所以我的答案将非常模糊。

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

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