2017-01-11 9 views
1

У меня есть .asc файл, который имеет 1000 строк. Каждый столбец строки имеет фиксированную длину и разделяется на одно пространство. Я хочу прочитать столбец идентификатора электронной почты, который начинается с позиции 296 и заканчивается на 326 позиции подряд.Как я могу прочитать данные из определенного места в .asc файле, используя C#

Есть ли способ прочитать такие данные от .asc файл?

+1

Что такое ".asc" файл? Какая кодировка используется? Являются ли строки действительно фиксированной шириной (в байтах) в файле? И вы хотите читать из определенной строки или всех строк? –

+1

Отсутствует пример или описание файла для анализа, вы можете использовать ['TextFieldParser'] (https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx) в [ режим фиксированной ширины] (https://msdn.microsoft.com/en-us/library/zezabash.aspx)? Это отлично можно использовать в C#, несмотря на то, что оно находится в пространстве имен Microsoft.VisualBasic.FileIO. См. http://csharphelper.com/blog/2012/05/use-the-textfieldparser-class-to-easily-read-a-file-containing-fixed-width-data-in-c/. – dbc

ответ

0

Это может сделать трюк для вас. Я просто читаю идентификаторы электронной почты в файле, какой бы файл расширения мне ни был, может быть, 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

Спасибо, Мохит, это сработало для меня. –

+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

Фактически у меня есть размер партии, определенный для обработки, чтобы ваш код соответствовал моему требованию. Хотя оптимизация означает здесь не производительность, а подход к обработке. –