2017-01-11 102 views
1

我有.asc文件,它有1000行。行中的每一列都是固定的長度,並由一個空格分開。我想讀取從296位開始並在326位置結束的電子郵件ID列。如何從casc文件的特定位置讀取數據?

有沒有什麼辦法從.asc文件中讀取這樣的數據?

+1

什麼是「.asc」文件?它使用什麼編碼?文件中的行是否爲固定寬度(以字節爲單位)?你想讀取一行或所有行嗎? –

+1

如果缺少要解析的文件的示例或說明,是否可以在[[TextFieldParser]](https://msdn.microsoft.com/zh-cn/library/microsoft.visualbasic.fileio.textfieldparser.aspx)中使用[固定寬度模式](https://msdn.microsoft.com/en-us/library/zezabash.aspx)?儘管存在於Microsoft.VisualBasic.FileIO命名空間中,它仍然可以在c#中使用。見例如http://csharphelper.com/blog/2012/05/use-the-textfieldparser-class-to-easily-read-a-file-containing-fixed-width-data-in-c/。 – dbc

回答

0

這可能對你有用。我只是閱讀文件中的電子郵件ID,無論它是我的擴展文件,可能是txt或asc。此外,它不事關如果電子郵件地址是在其他地方,而不是定位296或326

public void ExtractAllEmails() 
{ 
    string datafrmAsc = File.ReadAllText(YourASCFile); //read File 
    Regex emailRegex = new Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", RegexOptions.IgnoreCase); 
    MatchCollection emailMatches = emailRegex.Matches(datafrmAsc); 
    StringBuilder sb = new StringBuilder(); 
    foreach (Match emailMatch in emailMatches) 
    { 
     sb.AppendLine(emailMatch.Value); 
    } 
    File.WriteAllText(SomeTxtFile, sb.ToString()); 
} 
+0

謝謝Mohit它爲我工作。 –

+0

對SO表示感謝的另一種方式是通過提出答案。那麼,高興地幫助,你是最受歡迎的。 :) –

1

假設是大的文本文件,你可以這樣做:

 List<string> emailsList = new List<string>(); 
     int startIndex = 295; 
     int endIndex = 325; 

     using (FileStream stream = File.Open("c:\\test.asc", FileMode.Open)) 
     using (StreamReader sr = new StreamReader(stream)) 
     { 
       string line = string.Empty; 
       while ((line = sr.ReadLine()) != null) 
       { 
        emailsList.Add(line.Substring(startIndex, endIndex - startIndex).Trim()); 
       } 

     } 
+0

謝謝尼諾。雖然更早的代碼解決了我的問題。但是你的代碼也是位優化的。我有不同的實現方式,所以也會使用你的代碼。 –

+0

很高興我能幫到你。我的方法更優化一點(它逐行讀取文件,而@Mohit Shrivastava一次加載所有文本),因爲您聲明有成千上萬行。 – Nino

+0

實際上,我已經爲處理定義了批量大小,所以您的代碼符合我的要求。雖然優化意味着不是性能,而是處理方法。 –

相關問題