C# Консольное приложение - Streamwriter перезаписывает CSV-файл каждый раз, когда записывает новую «Страницу» из вызова API, оставляя только последние результаты вызова API - PullRequest
1 голос
/ 18 февраля 2020

Итак, я ЗНАЮ, что это простая вещь, но я обычно работаю с ASP. NET веб-приложениями и SQL, поэтому у меня возникла проблема с этим консольным приложением.

У меня есть консольное приложение, которое извлекает «страницу» данных из вызова API веб-клиента. Это вытягивает данные в строку (и) и записывает эти данные в файл CSV. Затем метод зацикливается, увеличивая «pagenum» на +1, пока API не вернет строку «Записи не найдены».

Моя проблема в том, что вместо добавления каждой новой "страницы" данных в существующий файл CSV он перезаписывает файл предыдущей "страницей" данных. Итак, я пишу страницу 1, затем получаю страницу 2, и все данные в CSV заменяются данными, промывают и повторяют.

Мой вопрос: нужно ли создавать новую «строку» для каждая страница данных (возможно, увеличение имени строковой переменной на 1 (s1, s2, s3) в зависимости от номера страницы или мне просто нужно изменить циклы, чтобы использовать какую-то другую часть Streamwriter (например, есть ли команда добавления строки) Мне нужно позвонить в конце l oop?) Если да, какие-либо идеи о том, как это сделать, основаны на моем примере кода ниже? (ПРИМЕЧАНИЕ: у меня есть несколько Console.WriteLines для целей отладки, чтобы я мог видеть данные во время тестирования.)

while (!s.Contains("No records found")) //When API returns "No Records Found" we know we've reached the last page of data we need to get.
        {
            rpcURL = "https://api.WEBSITEcom/urlrpc?method=getPlacementReport&username=" + userName + "&password=" + passWord + "&class_code=" + classCode + "&from_date=" + startDate + "&to_date=" + endDate + "&page_num=" + page;
            Console.WriteLine(rpcURL);
            client.Headers.Add("user-agent", "Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
            using (var stream = client.OpenRead(rpcURL))
            using (var sr = new StreamReader(stream))
            {
                s = sr.ReadToEnd();

                Console.WriteLine(s);
                string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                string docPath = path + "\\" + "AleksReport.csv";


                if (!s.Contains("No records found"))
                {
                    using (StreamWriter writer = new StreamWriter(docPath))
                    {
                        writer.WriteLine(s);
                    }
                }
                else
                {
                    Console.WriteLine("End of records");
                }
            }
            page++;

        }

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Вы можете передать второй аргумент StreamWriter, который указывает, хотите ли вы добавить к файлу. Здесь, очевидно, вы хотите true:

using (StreamWriter writer = new StreamWriter(docPath, true))

Документация

Тем не менее, я думаю, что лучший способ - не создавать потоковую запись для каждой итерации l oop. Создайте один потоковый писатель и используйте его повторно:

string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string docPath = path + "\\" + "AleksReport.csv";
using (StreamWriter writer = new StreamWriter(docPath)) {
    while (!s.Contains("No records found")) //When API returns "No Records Found" we know we've reached the last page of data we need to get.
    {
        rpcURL = "https://api.WEBSITEcom/urlrpc?method=getPlacementReport&username=" + userName + "&password=" + passWord + "&class_code=" + classCode + "&from_date=" + startDate + "&to_date=" + endDate + "&page_num=" + page;
        Console.WriteLine(rpcURL);
        client.Headers.Add("user-agent", "Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
        using (var stream = client.OpenRead(rpcURL))
        using (var sr = new StreamReader(stream))
        {
            s = sr.ReadToEnd();

            Console.WriteLine(s);

            if (!s.Contains("No records found"))
            {
                writer.WriteLine(s);
            }
            else
            {
                Console.WriteLine("End of records");
            }
        }
        page++;
    }
}
0 голосов
/ 18 февраля 2020

Используйте этот конструктор public StreamWriter (string path, bool append); со вторым параметром, установленным в true. Подробнее здесь .

append

true для добавления данных в файл; false, чтобы перезаписать файл. Если указанный файл не существует, этот параметр не имеет никакого эффекта, и конструктор создает новый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...