C# 文本操作
我有一个格式不正确的以制表符分隔的csv文件C# 文本操作,c#,linq,C#,Linq,我有一个格式不正确的以制表符分隔的csv文件 Name AA BB CC AA BB CC XX5 2 7 8b YY4 2 6 2 ZZ3 8 21 9 RR2 1 2 6 SS1 6 7 23 应该是这样的 Name AA BB CC XX5 2 7 8b YY4 2 6 2 ZZ3 8 21 9 RR2 1 2 6 SS1 6 7 23
Name AA BB CC AA BB CC
XX5 2 7 8b
YY4 2 6 2
ZZ3 8 21 9
RR2 1 2 6
SS1 6 7 23
应该是这样的
Name AA BB CC
XX5 2 7 8b
YY4 2 6 2
ZZ3 8 21 9
RR2 1 2 6
SS1 6 7 23
我无法手动执行此操作,因为行太多了。有没有一种算法可以自动实现这一点
第一行是标题
这只是一个例子,实际文件有50列,超过10000行
,我会考虑一种不同的方法。如果数据将在数据库中的一个表中结束,您可以在该表上执行SQL查询,请导入一个如下所示的表:mytable:
NAME nvarchar(10) PRIMARY KEY NOT NULL
AA nvarchar(10)
BB nvarchar(10)
CC nvarchar(10)
AA2 nvarchar(10)
BB2 nvarchar(10)
CC2 nvarchar(10)
导入数据后,请尝试以下SQL:
UPDATE mytable SET AA = AA2 WHERE AA2 IS NOT NULL
UPDATE mytable SET BB = BB2 WHERE BB2 IS NOT NULL
UPDATE mytable SET CC = CC2 WHERE CC2 IS NOT NULL
。。。这将把第二组“列”中的值复制到第一组中
然后简单地删除列AA2、BB2和CC2
另一个选项,我在这里做假设,把它放到一个文本编辑器中,用零替换出现的三个连续制表符我会考虑另一种方法。如果数据将在数据库中的一个表中结束,您可以在该表上执行SQL查询,请导入一个如下所示的表:
mytable:
NAME nvarchar(10) PRIMARY KEY NOT NULL
AA nvarchar(10)
BB nvarchar(10)
CC nvarchar(10)
AA2 nvarchar(10)
BB2 nvarchar(10)
CC2 nvarchar(10)
导入数据后,请尝试以下SQL:
UPDATE mytable SET AA = AA2 WHERE AA2 IS NOT NULL
UPDATE mytable SET BB = BB2 WHERE BB2 IS NOT NULL
UPDATE mytable SET CC = CC2 WHERE CC2 IS NOT NULL
。。。这将把第二组“列”中的值复制到第一组中
然后简单地删除列AA2、BB2和CC2
另一个选项,我在这里做假设,把它放到一个文本编辑器中,用零替换出现的三个连续制表符 我不喜欢
string.Format
,但可能喜欢下面的内容;请注意,Length==7
测试假定在数据结束后不再有\t
,但您可以将其替换为对空白字符串等的测试
static void Main() {
var qry = from line in ReadLines("data.tsv")
let cells = line.Split('\t')
let format = cells.Length == 7 ? "{0}\t{4}\t{5}\t{6}"
: "{0}\t{1}\t{2}\t{3}"
select string.Format(format, cells);
using (var writer = File.CreateText("new.tsv")) {
foreach(string line in qry) {
writer.WriteLine(line);
}
}
}
static IEnumerable<string> ReadLines(string path) {
using (var reader = File.OpenText(path)) {
string line;
while ((line = reader.ReadLine()) != null) {
yield return line;
}
}
}
static void Main(){
var qry=从读取行中的行(“data.tsv”)
let cells=line.Split('\t')
let format=cells.Length==7?”{0}\t{4}\t{5}\t{6}”
:“{0}\t{1}\t{2}\t{3}”
选择string.Format(格式,单元格);
使用(var writer=File.CreateText(“new.tsv”)){
foreach(qry中的字符串行){
writer.WriteLine(行);
}
}
}
静态IEnumerable可读行(字符串路径){
使用(var reader=File.OpenText(路径)){
弦线;
而((line=reader.ReadLine())!=null){
收益率回归线;
}
}
}
编辑;要删除空白,请执行以下操作:
static string Join(this IEnumerable<string> data, string delimiter) {
using (var iter = data.GetEnumerator()) {
if (!iter.MoveNext()) return "";
StringBuilder sb = new StringBuilder(iter.Current);
while (iter.MoveNext()) {
sb.Append(delimiter).Append(iter.Current);
}
return sb.ToString();
}
}
static void Main() {
var qry = from line in ReadLines("data.tsv")
let cells = line.Split('\t').Where(s => s != "")
select cells.Join("\t");
using (var writer = File.CreateText("new.tsv")) {
foreach(string line in qry) {
writer.WriteLine(line);
}
}
}
静态字符串联接(此IEnumerable数据,字符串分隔符){
使用(var iter=data.GetEnumerator()){
如果(!iter.MoveNext())返回“”;
StringBuilder sb=新StringBuilder(iter.Current);
while(iter.MoveNext()){
sb.Append(定界符).Append(iter.Current);
}
使某人返回字符串();
}
}
静态void Main(){
var qry=从读取行中的行(“data.tsv”)
让单元格=line.Split('\t')。其中(s=>s!=“”)
选择单元格。加入(“\t”);
使用(var writer=File.CreateText(“new.tsv”)){
foreach(qry中的字符串行){
writer.WriteLine(行);
}
}
}
我不喜欢字符串.Format
,但可能喜欢下面的内容;请注意,Length==7
测试假定在数据结束后不再有\t
,但您可以将其替换为对空白字符串等的测试
static void Main() {
var qry = from line in ReadLines("data.tsv")
let cells = line.Split('\t')
let format = cells.Length == 7 ? "{0}\t{4}\t{5}\t{6}"
: "{0}\t{1}\t{2}\t{3}"
select string.Format(format, cells);
using (var writer = File.CreateText("new.tsv")) {
foreach(string line in qry) {
writer.WriteLine(line);
}
}
}
static IEnumerable<string> ReadLines(string path) {
using (var reader = File.OpenText(path)) {
string line;
while ((line = reader.ReadLine()) != null) {
yield return line;
}
}
}
static void Main(){
var qry=从读取行中的行(“data.tsv”)
let cells=line.Split('\t')
let format=cells.Length==7?”{0}\t{4}\t{5}\t{6}”
:“{0}\t{1}\t{2}\t{3}”
选择string.Format(格式,单元格);
使用(var writer=File.CreateText(“new.tsv”)){
foreach(qry中的字符串行){
writer.WriteLine(行);
}
}
}
静态IEnumerable可读行(字符串路径){
使用(var reader=File.OpenText(路径)){
弦线;
而((line=reader.ReadLine())!=null){
收益率回归线;
}
}
}
编辑;要删除空白,请执行以下操作:
static string Join(this IEnumerable<string> data, string delimiter) {
using (var iter = data.GetEnumerator()) {
if (!iter.MoveNext()) return "";
StringBuilder sb = new StringBuilder(iter.Current);
while (iter.MoveNext()) {
sb.Append(delimiter).Append(iter.Current);
}
return sb.ToString();
}
}
static void Main() {
var qry = from line in ReadLines("data.tsv")
let cells = line.Split('\t').Where(s => s != "")
select cells.Join("\t");
using (var writer = File.CreateText("new.tsv")) {
foreach(string line in qry) {
writer.WriteLine(line);
}
}
}
静态字符串联接(此IEnumerable数据,字符串分隔符){
使用(var iter=data.GetEnumerator()){
如果(!iter.MoveNext())返回“”;
StringBuilder sb=新StringBuilder(iter.Current);
while(iter.MoveNext()){
sb.Append(定界符).Append(iter.Current);
}
使某人返回字符串();
}
}
静态void Main(){
var qry=从读取行中的行(“data.tsv”)
让单元格=line.Split('\t')。其中(s=>s!=“”)
选择单元格。加入(“\t”);
使用(var writer=File.CreateText(“new.tsv”)){
foreach(qry中的字符串行){
writer.WriteLine(行);
}
}
}
快速技巧强>
根据在输入文件中找到的确切模式,可能还可以使用简单的文本编辑器(或sed)来解决此问题,本质上是将3个选项卡的任何序列替换为零快速技巧强> 根据在输入文件中找到的确切模式,也可以使用简单的文本编辑器(或sed)来解决此问题,基本上是将3个选项卡的任何序列替换为零,或者在C#中,尝试此方法。很快就组装好了,没有经过测试!完全
int columnposet=4;
使用(StreamReader sr=新的StreamReader(inputfile))
使用(StreamWriter sw=新StreamWriter(输出文件))
{
字符串行=sr.ReadLine();
string[]fields=line.Split('\t');
如果(字段[0]=“名称”)
{
西南写入线(行);
}
其他的
{
StringBuilder大纲=新建StringBuilder();
对于(int i=0;i或C#,试试这个。非常快地组合起来,根本不测试。
int columnposet=4;
使用(StreamReader sr=新流)
try
{
if (Regex.IsMatch(input, pattern))
{
Regex r = new Regex(pattern);
StringBuilder sBuilder = new StringBuilder();
Match m;
int i = 0;
for (m = r.Match(input); m.Success; m = m.NextMatch())
{
//sBuilder.Append(String.Format("Match[{0}]: ", i));
for (int j = 1; j < m.Length; j++)
{
sBuilder.Append(String.Format("{0} ", m.Groups[j].Value));
}
sBuilder.AppendLine("");
i++;
}
Console.WriteLine(sBuilder.ToString());
}
else
{
Console.WriteLine("No match");
}
Console.ReadLine();
}
catch (Exception e)
{
StringBuilder sBuilder = new StringBuilder();
sBuilder.Append("Error parsing: \"");
sBuilder.Append(pattern);
sBuilder.Append("\" - ");
sBuilder.Append(e.ToString());
Console.WriteLine(sBuilder.ToString());
}
}