我有一个固定列长的输入文件,我需要将文件转换为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
答案 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将具有相似的结果,但是具有字符串数组。