Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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#_String_Text_Text Files_Tab Delimited Text - Fatal编程技术网

C# 如何结合两种功能';用于删除文件的

C# 如何结合两种功能';用于删除文件的,c#,string,text,text-files,tab-delimited-text,C#,String,Text,Text Files,Tab Delimited Text,我有两个不同的函数来处理两种不同类型的输入文本文件。一个带双引号的文本文件和一个不带双引号的文本文件 我想知道如何将这两个函数组合成一个通用的函数,以便以更有效的方式处理 代码: //此函数用于处理不带双引号的文本文件 公共空间1() { 串旧; 字符串iniPath=Application.StartupPath+“\\list.ini”; bool isDeleteSectionFound=false; List deleteCodeList=新列表(); 使用(StreamReader s

我有两个不同的函数来处理两种不同类型的输入文本文件。一个带双引号的文本文件和一个不带双引号的文本文件

我想知道如何将这两个函数组合成一个通用的函数,以便以更有效的方式处理

代码:

//此函数用于处理不带双引号的文本文件
公共空间1()
{
串旧;
字符串iniPath=Application.StartupPath+“\\list.ini”;
bool isDeleteSectionFound=false;
List deleteCodeList=新列表();
使用(StreamReader sr=File.OpenText(iniPath))
{
而((old=sr.ReadLine())!=null)
{
if(old.Trim()等于(“[DELETE]”)
{
isDeleteSectionFound=true;
}
if(isDeleteSectionFound&!old.Trim()等于(“[DELETE]”)
{
deleteCodeList.Add(old.Trim());
}
}
}
StringBuilder sb=新的StringBuilder();
使用(StreamReader=File.OpenText(textBox1.Text))
{
而(!reader.EndOfStream)
{
var line=reader.ReadLine();
var value=line.Split('\t');
bool deleteLine=value.Any(v=>deleteCodeList.Any(w=>v.Equals(w));
如果(!deleteLine)
{
sb.Append(line+Environment.NewLine);
}
}
}
File.writealText(textBox1.Text,sb.ToString());
//返回;
}
//此函数用于处理带有双引号的文本文件
公共空堆栈()
{
串旧;
字符串iniPath=Application.StartupPath+“\\list.ini”;
bool isDeleteSectionFound=false;
List deleteCodeList=新列表();
使用(StreamReader sr=File.OpenText(iniPath))
{
而((old=sr.ReadLine())!=null)
{
if(old.Trim()等于(“[DELETE]”)
{
isDeleteSectionFound=true;
}
if(isDeleteSectionFound&!old.Trim()等于(“[DELETE]”)
{
deleteCodeList.Add(old.Trim());
}
}
}
StringBuilder sb=新的StringBuilder();
使用(StreamReader=File.OpenText(textBox1.Text))
{
而(!reader.EndOfStream)
{
var line=reader.ReadLine();
var values=line.Split('\t')。选择(v=>v.Trim('''');
bool deleteLines=values.Any(v=>deleteCodeList.Any(w=>v.Equals(w));
如果(!deleteLines)
{
sb.Append(line+Environment.NewLine);
}
}
}
File.writealText(textBox1.Text,sb.ToString());
MessageBox.Show(“完成”);
}

这两个功能之间的唯一区别是这一行:

// stack1 function
var value = line.Split('\t');

// stack2 function
var values = line.Split('\t').Select(v => v.Trim(' ', '"'));
最简单的方法可能是向方法中添加一个参数,然后在拆分后添加检查:

public void Split(bool shouldTrimQuotes)
{
     ...

     IEnumerable<string> value = line.Split('\t');         
     if (shouldTrimQuotes)
     {
         value = value.Select(v => v.Trim(' ', '"'));
     }

     ...
}
您还可以玩一点,尝试重构整个过程,尝试将较小的通用代码片段提取到单独的方法中,这样可以更清楚地了解它们在做什么。这是一种方法,例如:

// rewrites the specified file, removing all lines matched by the predicate
public static void RemoveLinesFromFile(string filename, Func<string, bool> match)
{
    var linesToKeep = File.ReadAllLines(filename)
        .Where(line => match(line))
        .ToList();

    File.WriteAllLines(filename, linesToKeep);
}

// gets the list of "delete codes" from the specified ini file
public IList<string> GetDeleteCodeList(string iniPath)
{
    return File.ReadLines(iniPath)
        .SkipWhile(l => l.Trim() != "[DELETE]")
        .Skip(1).ToList();
}

// removes lines from a tab-delimited file, where the specified listOfCodes contains
// at least one of the tokens inside that line
public static void RemoveLinesUsingCodeList(
    string filename,
    IList<string> listOfCodes,
    bool shouldTrimQuotes)
{
    RemoveLinesFromFile(filename, line =>
    {
        IEnumerable<string> tokens = line.Split('\t');               
        if (shouldTrimQuotes)
        {
            tokens = tokens.Select(v => v.Trim(' ', '"'));
        }
        return (tokens.Any(t => listOfCodes.Any(t.Equals)));
    });
}
//重写指定的文件,删除谓词匹配的所有行
公共静态void RemoveLinesFromFile(字符串文件名,Func匹配)
{
var linestokep=File.ReadAllLines(文件名)
.其中(行=>匹配(行))
.ToList();
File.writeAllines(文件名,linestokep);
}
//从指定的ini文件获取“删除代码”列表
公共IList GetDeleteCodeList(字符串路径)
{
返回文件.ReadLines(iniPath)
.SkipWhile(l=>l.Trim()!=“[DELETE]”)
.Skip(1.ToList();
}
//从以制表符分隔的文件中删除行,其中指定的listOfCodes包含
//该行中至少有一个令牌
使用代码列表删除公共静态无效项(
字符串文件名,
IList代码列表,
布尔应该(引用)
{
RemoveLinesFromFile(文件名,行=>
{
IEnumerable tokens=line.Split('\t');
if(shouldTrimQuotes)
{
令牌=令牌。选择(v=>v.Trim(“”“);
}
return(tokens.Any(t=>listOfCodes.Any(t.Equals));
});
}

我认为不需要任何参数。双引号不是文件名中的有效符号。您可以随时调整输入。@neolick:我认为这些值不是必需的文件名。OP正在分析一个以制表符分隔的文件,但在某些情况下只想修剪引号。@Groo您能告诉我如何添加参数吗。我对这件事真的很陌生。。此外,我还遇到一个错误
无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“string[]”。存在显式转换(是否缺少强制转换?
value=value.选择(v=>v.Trim('''''));`@stacy:是的,对不起,
value
变量的类型应显式设置为
IEnumerable
,否则编译器将使用
string[]
因为
var
关键字。@stacy:删除第一个方法,修改第二个方法,使其具有输入参数和
if
子句。最终得到一个方法,该方法根据其输入参数的行为不同。
// split, but don't trim quotes before comparison
Split(shouldTrimQuotes: false);

// split, trim quotes before comparison
Split(shouldTrimQuotes: true);
// rewrites the specified file, removing all lines matched by the predicate
public static void RemoveLinesFromFile(string filename, Func<string, bool> match)
{
    var linesToKeep = File.ReadAllLines(filename)
        .Where(line => match(line))
        .ToList();

    File.WriteAllLines(filename, linesToKeep);
}

// gets the list of "delete codes" from the specified ini file
public IList<string> GetDeleteCodeList(string iniPath)
{
    return File.ReadLines(iniPath)
        .SkipWhile(l => l.Trim() != "[DELETE]")
        .Skip(1).ToList();
}

// removes lines from a tab-delimited file, where the specified listOfCodes contains
// at least one of the tokens inside that line
public static void RemoveLinesUsingCodeList(
    string filename,
    IList<string> listOfCodes,
    bool shouldTrimQuotes)
{
    RemoveLinesFromFile(filename, line =>
    {
        IEnumerable<string> tokens = line.Split('\t');               
        if (shouldTrimQuotes)
        {
            tokens = tokens.Select(v => v.Trim(' ', '"'));
        }
        return (tokens.Any(t => listOfCodes.Any(t.Equals)));
    });
}