2013-06-27 76 views
-1

我正試圖找到最佳方法來提取日期和時間字符串,該字符串以非常非常奇怪的格式存儲在已檢索的文件名(字符串)中從FTP文件列表。從字符串中提取複雜的日期/時間格式

的字符串如下:

-rwxr-xr-x 1 ftp  ftp  267662 Jun 06 09:13 VendorInventory_20130606_021303.txt\r 

我想提取的具體數據是20130606_021303021303被格式化爲小時,秒和毫秒。 DateTime.Parse和DateTime.ParseExact不願意合作。任何想法如何讓這個啓動和運行?

回答

1

UPDATE我假設有一個固定結構到FTP上市文件顯示,這樣你就可以簡單地使用String.Substring提取時間字符串,然後用DateTime.ParseExact解析:

var s = "-rwxr-xr-x 1 ftp  ftp  267662 Jun 06 09:13 VendorInventory_20130606_021303.txt\r"; 
var datetime = DateTime.ParseExact(s.Substring(72,15),"yyyyMMddHHmmss",null); 


Original Answer

使用正則表達式。請嘗試以下操作:

var s = "-rwxr-xr-x 1 ftp  ftp  267662 Jun 06 09:13 VendorInventory_20130606_021303.txt\r"; 

/* 
    The following pattern means: 
    \d{8}) 8 digits (\d), captured in a group (the parentheses) for later reference 
    _   an underscore 
    (\d{6}) 6 digits in a group 
    \.   a period. The backslash is needed because . has special meaning in regular expressions 
    .*   any character (.), any number of times (*) 
    \r   carriage return 
    $   the end of the string 
*/ 
var pattern = @"(\d{8})_(\d{6})\..*\r$"; 

var match = Regex.Match(s, pattern); 
string dateString = matches.Groups[1].Value; 
string timeString = matches.Groups[2].Value; 

和解析使用ParseExact

var datetime = DateTime.ParseExact(dateString + timeString,"yyyyMMddHHmmss",null); 
3

看起來你已經拿到了文件清單,其中包括權限,用戶,所有者,文件大小,時間戳和文件名的整個行。

您要求的數據似乎只是文件名的一部分。首先使用一些基本的字符串操作(SplitSubstring等)。然後,如果您只有日期時間部分,則可以致電DateTime.ParseExact

先試試自己吧。如果遇到問題,請更新您的問題以顯示您正在嘗試的代碼,並且有人會進一步幫助您。

...

噢,很好。有沒有搞錯。我感覺很慷慨。這裏是一個單行的:

string s = // your string as in the question 

DateTime dt = DateTime.ParseExact(string.Join(" ", s.Split('_', '.'), 1, 2), 
            "yyyyMMdd HHmmss", null); 

但是,請下次嘗試一下你自己的第一個。

+0

我沒想到路過'null'成'ParseExact'的。 –

+1

@ZevSpitz - 爲提供者傳遞'null'告訴它使用* current *文化。您可以改爲傳遞'CultureInfo.InvariantCulture'。這裏沒關係,因爲在這個特定的格式字符串中沒有文化特定的項目。 –

0

這可能會實現:

string s = "-rwxr-xr-x 1 ftp ftp 267662 Jun 06 09:13 VendorInventory_20130606_021303.txt\r"; 

// you might need to adjust the IndexOf method a bit - if the filename/string ever changes... 
// or use a regex to check if there's a date in the given string 

// however - the first thing to do is extract the dateTimeString: 
string dateTimeString = s.Substring(s.IndexOf("_") + 1, 15); 

// and now extract the DateTime (you could also use DateTime.TryParseExact) 
// this should save you the trouble of substringing and parsing loads of ints manually :) 
DateTime dt = DateTime.ParseExact(dateTimeString, "yyyyMMdd_hhmmss", null);