我遇到的情况是,我会收到一个文本文件,其文本格式如下:
C:\Users\Admin\Documents\report2011.docx: My Report 2011
C:\Users\Admin\Documents\newposter.docx: Dinner Party Poster 08
如何修剪文本文件,以便修剪“:”及其后面的所有字符。
E.g。所以输出就像:
C:\Users\Admin\Documents\report2011.docx
C:\Users\Admin\Documents\newposter.docx
Current Code:
private void button1_Click(object sender, EventArgs e)
{
using (StreamWriter sw = File.AppendText(@"c:\output.txt"))
{
StreamReader sr = new StreamReader(@"c:\filename.txt");
Regex reg = new Regex(@"\w\:(.(?!\:))+");
List<string> parsedStrings = new List<string>();
while (sr.EndOfStream)
{
sw.WriteLine(reg.Match(sr.ReadLine()).Value);
}
}
}
不工作:(
答案 0 :(得分:1)
int index = myString.LastIndexOf(":");
if (index > 0)
myString= myString.Substring(0, index);
编辑 - 根据修改后的问题添加了答案。它可以略微浓缩,但为了清楚显示正在发生的事情而进行了扩展。
using (StreamWriter sw = File.AppendText(@"c:\output.txt"))
{
using(StreamReader sr = new StreamReader(@"input.txt"))
{
string myString = "";
while (!sr.EndOfStream)
{
myString = sr.ReadLine();
int index = myString.LastIndexOf(":");
if (index > 0)
myString = myString.Substring(0, index);
sw.WriteLine(myString);
}
}
}
答案 1 :(得分:1)
被修改
StreamReader sr = new StreamReader("yourfile.txt");
Regex reg = new Regex(@"\w\:(.(?!\:))+");
List<string> parsedStrings = new List<string>();
while (!sr.EndOfStream)
{
parsedStrings.Add(reg.Match(sr.ReadLine()).Value);
}
答案 2 :(得分:0)
确定。在阅读每一行时,请执行
Console.WriteLine(line.Substring(0,line.IndexOf(": "));
答案 3 :(得分:0)
我会使用此处给出的答案Code to trim part of a text file in C#并找到第二个匹配项,然后在子字符串中使用它。
var s = @"C:\Users\Admin\Documents\report2011.docx: My Report 2011";
var i = GetNthIndex(s,':',2);
var result = s.Substring(i+1);
public int GetNthIndex(string s, char t, int n)
{
int count = 0;
for (int i = 0; i < s.Length; i++)
{
if (s[i] == t)
{
count++;
if (count == n)
{
return i;
}
}
}
return -1;
}
答案 4 :(得分:0)
假设这是在文件应该存在的地方完成的,你可以通过在获得冒号索引后检查文件的存在来考虑(我假设的)描述中的任何冒号。
List<string> files = new List<string>();
files.Add(@"C:\Users\Admin\Documents\report2011.docx: My Report 2011");
files.Add(@"C:\Users\Admin\Documents\newposter.docx: Dinner Party Poster 08");
files.Add(@"C:\Users\Admin\Documents\newposter.docx: Dinner Party: 08");
int lastColon;
string filename;
foreach (string s in files)
{
bool isFilePath = false;
filename = s;
while (!isFilePath)
{
lastColon = filename.LastIndexOf(":");
if (lastColon > 0)
{
filename = filename.Substring(0, lastColon);
if (File.Exists(filename))
{
Console.WriteLine(filename);
isFilePath = true;
}
}
else
{
throw new FileNotFoundException("File not found", s);
}
}
}
答案 5 :(得分:0)
试试这个: 更快:
string s = @"C:\Users\Admin\Documents\report2011.docx: My Report 2011";
string path = Path.GetDirectoryName(s) + s.Split(new char[] { ':' }) [1];
Console.WriteLine(path); //C:\Users\Admin\Documents\report2011.docx
您需要导入System.IO
答案 6 :(得分:-1)
你可以使用split:
string[] splitted= myString.Split(':');
然后你得到一个数组,你拿第一个。
var mySplittedString = splitted[0]
如果您需要更多相关信息,请查看here。
编辑:在你的情况下,你得到一个大小至少为3的数组,所以你需要分割[0]和分割[1]