Member 13302374 Ответов: 4

C# - возвращает количество строк в строковом файле


Привет,

Я боролся с тем, что кажется таким простым вопросом: "Учитывая текст с каждой строкой, разделенной новым символом строки, верните, сколько строк есть.".

Мой код ниже.

С уважением

Что я уже пробовал:

    public static int CountLines(string text)
    {
        return File.ReadAllLines(text).Count();
    }
}

Mehdi Gholam

..- а в чем твоя проблема?

F-ES Sitecore

Что не так с кодом, который у вас есть?

Member 13302374

Это дает мне необработанное исключение, указывающее "незаконные символы в пути", когда я строю и запускаю код

Karthik_Mahalingam

что такое значение в "тексте"

F-ES Sitecore

"text" - это имя файла, и ReadAllLines возвращает строки в этом файле. Если "текст" - это текст, в котором вы хотите подсчитать строки, то вам нужно использовать Split, как было предложено (хотя попробуйте разделить на"\r\n"). Или просто google, как было предложено также, это невероятно тривиальная проблема.

Member 13302374

В этом практическом упражнении "текст" - это строка, которая запрограммирована быть любой длины. Я надеюсь, что это имеет смысл

Dave Kreskowiak

Это не досье. Вы рассматриваете текст, переданный в этот метод, как имя файла. Метод ReadAllText ожидает, что ему будет передан путь к файлу. Вы передаете что-то другое, чем путь к файлу.

Вы не можете использовать файл.ReadAllText для этого. Вам просто нужно разделить строку, которая передается на '\r\n'.

4 Ответов

Рейтинг:
1

OriginalGriff

О, есть масса способов!
Подсчет строк в строке[^]- прочтите, это покажет вам много способов ... и сколько они стоят в плане производительности.


Рейтинг:
1

BillWoodruff

Исходя из того, что вы говорите, Я думаю, что проблема заключается в следующем: у вас плохой путь к файлу. Гораздо менее вероятная проблема заключается в том, что вы пытаетесь прочитать файл без ... или очень странный, или перепутанный ... символ(ы) разделителя строк.

Примечание: Я не рассматриваю вопрос об обнаружении того, заблокирован ли файл или вам отказано в доступе к файлу по его настройкам разрешений: я предполагаю, что ошибки времени выполнения, вызванные этими аспектами, будут очевидны для вас.

Попробовать это:

public static string[] validextensions = new[] {".txt",".cs", ".csv"};
        
public static int CountLines(string filepath)
{
    string extension = Path.GetExtension(filepath);
    
    if(! validextensions.Contains(extension)) throw new InvalidDataException($"File extension {extension} is not valid");
            
    if (File.Exists(filepath))
    {
        try
        {
            return File.ReadLines(filepath).Count();
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error reading file  {filepath} : {e.Message}");
        }
    }
    else
    {
        Console.WriteLine($"{filepath} : does not exist");
    }
    
    return -1;
}
Но вы должны подумать, действительно ли вы хотите вызвать чтение всего файла только для подсчета строк: 'ReadLines возвращает IEnumerable<string> : 'Count() будет перечислять его. Предполагая, что вы планируете использовать текст (строки) в файле, это имеет больше смысла:
public static string[] validextensions = new[] {".txt",".cs", ".csv"};
        
public static int CountLines(string filepath, out string[] lines)
{
    string extension = Path.GetExtension(filepath);
    
    if(! validextensions.Contains(extension)) throw new InvalidDataException($"File extension {extension} is not valid");
            
    lines = null;
    
    if (File.Exists(filepath))
    {
        try
        {
            lines = File.ReadLines(filepath).ToArray();
            return lines.Length;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error reading file  {filepath} : {e.Message}");
        }
    }
    else
    {
        Console.WriteLine($"{filepath} : does not exist");
    }

    return -1;
}
Используйте пример: ... в каком-то методе или EventHandler
string[] readlines;
            
var nlines = CountLines(@"C:\Users\User\Desktop\Folder\file name.txt", out readlines);
Существует множество методов, доступных для чтения файлов: отличная статья, сравнивающая их, - это: [^].

Имейте в виду, что в то время как 'ReadLines является надежным ... может иметь дело со многими типами окончаний строк ... есть много возможностей:
Цитата:
Имейте в виду, что для файлов unicode существует ряд различных символов, которые считаются законными Терминаторами строк. Они включают в себя: символ возврата каретки (U+000D), символ перевода строки (U+000A), символ возврата каретки (U+000D), за которым следует символ перевода строки (U+000A), символ разделителя строк (U+2028) и символ разделителя абзацев (U+2029). Иногда также существует символ "конец текста" (U+0003), который по закону может использоваться в качестве Терминатора последней строки файла. – LBushkin Дж
[^]


Рейтинг:
0

shikhar mittal

Привет, вы также можете попробовать приведенный ниже код.

public static int CountLines(string text)
{
    return text.Split('\n').Length;
}


Member 13302374

Хм, не работает. Я вынул разделенную часть и попробовал еще раз, так как данный текст уже разделен символами новой строки, но все равно это не работает

shikhar mittal

Что не работает с вышеприведенным решением? Также, пожалуйста, опубликуйте пример строки, которую вы используете для тестирования.

Afzaal Ahmad Zeeshan

Я не голосовал и не буду голосовать за этот ответ, просто на случай, если кто-то понизит голос и вы подумаете, что это сделал я.

Но, Шихар, ты пробовал "\r\n", в большинстве случаев это будет использоваться для обозначения новой строки. Возможно, было бы гораздо лучше, если бы вы использовали, Environment.NewLine позволить.NET выберите новые строки в вашем контенте.

Рейтинг:
0

Vijayavel Nadar

Используйте следующий код

string[] stringSeparators = new string[] {"\r\n"};

result = source.Split(stringSeparators, StringSplitOptions.None);

return result.Length