Разбор отдельных строк в файле robots.txt с помощью C # - PullRequest
4 голосов
/ 06 августа 2010

Работа над приложением для разбора robots.txt. Я написал сам метод, который извлек файл из веб-сервера и выбросил вывод в текстовое поле. Я хотел бы, чтобы выходные данные отображали одну строку текста для каждой строки в файле, так же, как это выглядело бы, если бы вы обычно смотрели на файл robots.txt, однако вывод в моем текстовом поле - это все строки текста без возврат каретки или разрывы строк. Поэтому я подумал, что буду хитрым, сделаю строку [] для всех строк, сделаю цикл foreach, и все будет хорошо. Увы, это не сработало, поэтому я подумал, что попробую System.Enviornment.Newline, все еще не работает. Вот код, как он звучит сейчас ... как я могу изменить это, чтобы я получил все отдельные строки robots.txt, а не кучу текста, скомбинированного вместе?

public void getRobots()
{
    WebClient wClient = new WebClient();
    string url = String.Format("http://{0}/robots.txt", urlBox.Text);

    try
    {
        Stream data = wClient.OpenRead(url);
        StreamReader read = new StreamReader(data);
        string[] lines = new string[] { read.ReadToEnd() };

        foreach (string line in lines)
        {
            textBox1.AppendText(line + System.Environment.NewLine);
        }
    }
    catch (WebException ex)
    {
        MessageBox.Show(ex.Message, null, MessageBoxButtons.OK);
    }
}

Ответы [ 4 ]

7 голосов
/ 06 августа 2010

Вы читаете весь файл в первый элемент массива lines:

string[] lines = new string[] {read.ReadToEnd()};

Таким образом, все, что делает ваш цикл - это добавление всего содержимого файла в TextBox, после чего следуетсимвол новой строки.Замените эту строку на эти:

string content = read.ReadToEnd();
string[] lines = content.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);

и посмотрите, работает ли это.

Редактировать : альтернативный и, возможно, более эффективный способ, как указано ниже в комментарии Фиша о чтениистрока за строкой - замените код в блоке try следующим:

Stream data = wClient.OpenRead(url);
StreamReader read = new StreamReader(data);

while (read.Peek() >= 0) 
{
    textBox1.AppendText(read.ReadLine() + System.Environment.NewLine);
}
2 голосов
/ 06 августа 2010

Вам нужно сделать textBox1 многострочным. Тогда я думаю, что вы можете просто пойти

textBox1.Lines = lines;

но позвольте мне проверить это

1 голос
/ 06 августа 2010

Попробуйте

public void getRobots()
{
    WebClient wClient = new WebClient();
    string robotText;
    string[] robotLines;
    System.Text.StringBuilder robotStringBuilder;

    robotText = wClient.DownloadString(String.Format("http://{0}/robots.txt", urlBox.Text));

    robotLines = robotText.Split(Environment.NewLine);

    robotStringBuilder = New StringBuilder();

    foreach (string line in robotLines)
    {
        robotStringBuilder.Append(line);
        robotStringBuilder.Append(Environment.NewLine);
    }

    textbox1.Text = robotStringBuilder.ToString();
}
1 голос
/ 06 августа 2010

Попробуйте использовать .Read () в цикле while вместо .ReadToEnd () - я думаю, вы просто получаете весь файл одной строкой в ​​массиве строк. Отладка и проверка количества строк [], чтобы убедиться в этом.

Редактировать: Вот пример кода. Не проверял это, но я думаю, что это должно работать хорошо;

Stream data = wClient.OpenRead(url);
StreamReader read = new StreamReader(data);

List<string> lines = new List<string>();

string nextLine = read.ReadLine();  
while (nextLine != null)
{
    lines.Add(nextLine);
    nextLine = read.ReadLine();
}

textBox1.Lines = lines.ToArray();
...