我有一些sql命令被一个额外的换行符分隔开来:
ALTER TABLE XXX
ALTER COLUMN xxx real
ALTER TABLE YYY
ALTER COLUMN yyy real
ALTER TABLE ZZZ
ALTER COLUMN zzz real
我尝试使用一系列字符分隔符来读取文件,如下所示
new char[] { '\n', '\r'}
在这个方法中:
private static List<string> ReadFile(string FileName, char[] seps)
{
if (!File.Exists(FileName))
{
Console.WriteLine("File not found");
return null;
}
using (StreamReader sr = new StreamReader(FileName, Encoding.Default))
{
string content = sr.ReadToEnd();
return content.Split(seps, StringSplitOptions.RemoveEmptyEntries).ToList();
}
}
然而,这似乎并没有起作用。我想让每个命令由一个单独的字符串表示。我怎么能这样做?
答案 0 :(得分:3)
为什么不使用File.ReadAllLines()
?
private static List<string> ReadFile(string FileName)
{
if (!File.Exists(FileName))
{
Console.WriteLine("File not found");
return null;
}
var lines = File.ReadAllLines(FileName);
return lines.ToList();
}
这将自动按换行符读取和拆分文件。
如果要过滤掉空行,请执行以下操作:
var nonEmpty = ReadFile(path).Where(x => !string.IsNullOrEmpty(x)).ToList();
旁注,如果找不到文件,我会更改你的if语句抛出异常。
if (!File.Exists(FileName))
{
throw new FileNotFoundException("Can't find file");
}
答案 1 :(得分:1)
您可以过滤示例。当我读到它们时,空行的长度为1,其char值由于某种原因表示为131。所以我只是按长度过滤&gt; 1
void Main()
{ var results = ReadFile(@&#34; C:\ temp \ sql.txt&#34;,new char [] {&#39; \ n&#39;}); Console.WriteLine(results.Count); foreach(结果中的结果) { Console.WriteLine(结果); } }
private static List<string> ReadFile(string FileName, char[] seps)
{
if (!File.Exists(FileName))
{
Console.WriteLine("File not found");
return null;
}
using (StreamReader sr = new StreamReader(FileName, Encoding.Default))
{
string content = sr.ReadToEnd();
return content.Split(seps, StringSplitOptions.RemoveEmptyEntries).Where (c => c.Length > 1).ToList();
}
}
答案 2 :(得分:1)
试试这个:
private static List<string> ReadFile(string FileName)
{
List<string> commands = new List<string>();
StringBuilder command = new StringBuilder();
if (!File.Exists(FileName))
{
Console.WriteLine("File not found");
return null;
}
foreach (var line in File.ReadLines(FileName))
{
if (!String.IsNullOrEmpty(line))
{
command.Append(line + "\n");
}
else
{
commands.Add(command.ToString());
command.Clear();
}
}
commands.Add(command.ToString());
return commands;
}
答案 3 :(得分:1)
如果你确定你总是有\ r \ n行结尾,你可以使用:
var commands = content.Split(new []{"\r\n\r\n"}, StringSplitOptions.RemoveEmptyEntries);
否则,请尝试使用正则表达式:
var commands = Regex.Split(content, @"\r?\n\r?\n")
答案 4 :(得分:1)
谢谢大家的回答。我最终使用了这个辅助方法:
private static List<string> GetCommands(string location)
{
List<string> ret = new List<string>();
List<string> tmp = ReadFile(location, new string[] { "\r\n\r\n"});
for (int i = 0; i < tmp.Count; i++)
{
string rem = tmp[i].Replace("\r", "");
ret.Add(rem);
}
return ret;
}
顺便说一下,Python中的等价物要容易得多。例如,我正在尝试做的事情可以用以下三行来表达:
with open('commands.txt', 'r') as f:
content = f.read()
commands = [ command for command in content.split('\n\n') ]