2015-02-11 60 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/

這是不正確的方法的時候,但有時這是你所需要的。