2015-02-11 30 views
0

我需要从文本文件中读取数据,并只从中获取特定数据。该文本文件有多条线路,类似下面只读文本文件中的某些列

12/05/2014 06:52 c:\BACKUPS\INT100\BACKUP\BACKUP.ZIP 
12/05/2014 06:51 c:\BACKUPS\INT1000\BACKUP\BACKUP.ZIP 

我需要的日期,时间和(在这种情况下,100和1000)的数量,但无法弄清楚如何摆脱的其他东西一样“c:\ backups \ INT”和“\ BACKUP \ BACKUP.ZIP”。

我想过使用子串方法,但它只会部分工作。加上INT号码可以在1-9999之间。

这是我有什么,此刻读取文本文件数据到DataTable,然后进入一个GridView

StreamReader readData = new StreamReader(@"c:\Users\1484814\desktop\date.txt"); 

DataTable listOFDates = new DataTable(); 
listOFDates.Columns.Add("Dates"); 

while (!readData.EndOfStream) 
{ 
    string shortenLine = readData.ReadLine(); 

    // shortenLine = shortenLine.Substring(0, 35); 

    listOFDates.Rows.Add(shortenLine); 
} 
gv_textFile.DataSource = listOFDates; 
+2

它有'很多行',或'所有行'像你显示的例子?路径总是一样的(数字除外)? – 2015-02-11 14:58:21

+0

你是否熟悉'string.Split()' – MethodMan 2015-02-11 15:04:52

+0

是的,路径始终是唯一的变化是日期和整数(INT100,INT101,INT103等) – wubblyjuggly 2015-02-11 15:08:01

回答

1

若所有的线条都是一样的,你可以得到的日期,然后将号码与一个衬垫:

var text = File.ReadAllLines(@"c:\Users\1484814\desktop\date.txt"); 

var dates = text.Select(line => DateTime.Parse(line.Substring(0, 16))); 
var numbers = text.Select(line => line.Substring(31, line.IndexOf(@"\BACKUP\") - 31)); 

对于日期,你把字符串的开始,并将其解析到一个DateTime

对于数字,进入数字索引,然后采取的东西,直到你点击\BACKUP\部分(这是数字后的最小独特部分)。 -31是因为Substring需要一个length,而不是结束索引。

如果提取神奇数字:

const int END_OF_DATE = 16; 
const int START_OF_NUMBER = 31; 

var text = File.ReadAllLines(@"c:\Users\1484814\desktop\date.txt"); 

var dates = text.Select(line => DateTime.Parse(line.Substring(0, END_OF_DATE))); 
var numbers = text.Select(line => line.Substring(START_OF_NUMBER, line.IndexOf(@"\BACKUP\") - START_OF_NUMBER)); 

你出现了两个IEnumerable s,它可以用养活你行。

有多种方式可以在后面加上你的价值,但是,如果我们跟着你在做什么(手动添加的每个条目作为行),你可以通过遍历的值与for循环达到这种效果:

DataTable listOFDates = new DataTable(); 
listOFDates.Columns.Add("Dates"); 
listOFDates.Columns.Add("Numbers"); 
for (int i = 0; i < dates.Count(); i++) 
{ 
    listOFDates.Rows.Add(dates[i], numbers[i]); 
} 

我们可以安全地迭代两个具有相同索引的列表,因为我们知道它们具有相同的大小。

但是,此方法要求您通过添加.ToList()和日期和数字查询的结尾,将以前的LINQ查询转换为列表。如果您希望将其保留为通用IEnumerable而不是列表,则可以使用.ElementAt(i)而不是[i]

+0

这看起来像一个很好的解决方案,但我不知道如何从两个IEnumerables中获取值? – wubblyjuggly 2015-02-13 10:33:45

0

如果“2014年12月5日06:51 C:\ BACKUPS \ INT1000 \ BACKUP \ BACKUP.ZIP”是一致的格式,那么你可以做,假设行是一个字符串[]与您的文件的行:

string[] Lines= File.ReadAllLines("file.txt"); 

foreach(var Line in Lines) 
{ 
string[] Parameters= Line.Split(' '); 
string Date= Parameters[0]; 
string Time= Parameters[1]; 
string[] PathInfo= Parameters[2].Split('\\'); 
int Number= Convert.ToInt32(PathInfo[2].Replace("Int","")); 
} 

如果你的路径并不总是相同的,我可以提供你用另一个例子。

3

一个可能的解决方案

StreamReader readData = new StreamReader(@"c:\Users\1484814\desktop\date.txt"); 

DataTable listOFDates = new DataTable(); 
listOFDates.Columns.Add("Dates", typeof(DateTime)); 
listOFDates.Columns.Add("Numbers", typeof(int)); 

while (!readData.EndOfStream) 
{ 
    string line = readData.ReadLine(); 
    string[] parts = line.Split(' '); 
    DateTime dt = DateTime.ParseExact(string.Join(" ", parts[0], parts[1]), "dd/MM/yyyy hh:mm", CultureInfo.CurrentCulture, DateTimeStyles.None); 
    int number = Convert.ToInt32(Regex.Match(parts[2], @"\d+").Value); 
    listOFDates.Rows.Add(new object[] {dt, number}); 
} 
gv_textFile.DataSource = listOFDates; 

当然,这里假设你的日期部分正好总是在上面的格式和路径里面的数字是在那个位置目前只是一个时间。

0

如果您使用的是DataTable,还可以使用OLEDB像文本文件一样处理数据库。你会使用SQL查询与文件进行交互。

只需导入System.Data.OleDb并像使用其他任何数据库一样使用OleDb对象(连接,数据读取器等)。当然,您不会有存储过程,但可以使用参数化查询。

如果使用正确的连接字符串,这也适用于Excel文件。

欲了解更多信息: http://www.connectionstrings.com/textfile/

这是不正确的方法的时候,但有时这是你所需要的。

相关问题