Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文本操作_C#_Linq - Fatal编程技术网

C# 文本操作

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

我有一个格式不正确的以制表符分隔的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
我无法手动执行此操作,因为行太多了。有没有一种算法可以自动实现这一点

第一行是标题


这只是一个例子,实际文件有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


另一个选项,我在这里做假设,把它放到一个文本编辑器中,用零替换出现的三个连续制表符
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());
        }
    }