2014-11-03 2 views
2

Я читаю текстовый файл с помощью C# .Net v3.5 выразить 2010, содержащие целые числа в форматеПреобразование строкового массива в целочисленном массиве

18 11 2 18 3 14 1 0 1 3 22 15 0 6 8 23 18 1 3 4 10 15 24 17 17 16 18 10 17 18 23 17 11 19 

по

string[] code = System.IO.File.ReadAllLines(@"C:\randoms\randnum.txt"); 

я тогда placethis в a строка

string s1 = Convert.ToString(code); 

И нужно уметь читать это в массиве int для некоторой математической обработки.

Я пробовал все, предложило на этом сайте в рамках других сообщений по этой теме, в том числе при разборе и скрытом массиве, но как только я пытаюсь это я получаю страшную «входная строка не в правильном формате» сообщение

+0

Почему вы преобразовываете строку [] в строку снова? – dotctor

+0

вам нужно будет преобразовать каждое значение в целое число – Icepickle

ответ

1
var intArray = File.ReadAllText(@"C:\randoms\randnum.txt") 
     .Split((char[]) null, StringSplitOptions.RemoveEmptyEntries) 
     .Select(int.Parse).ToArray(); 
+0

любую причину проголосовать? – dotctor

+1

Я не понимал, что Split() работал так с нулевым значением. Мне нравится это решение, так как оно предполагает любое количество пробелов между каждым целым числом. –

+0

Работает великолепно. Спасибо –

-1

На первый взгляд кажется, что проблема в том, что вы читаете цифры, используя ReadAllLines. Это вернет массив строк, где каждая строка представляет одну строку в вашем файле. В вашем примере кажется, что ваши номера находятся в одной строке. Вы можете использовать System.IO.File.ReadAllText, чтобы получить одну строку. Затем используйте .Split(new char[]{}, StringSplitOptions.RemoveEmptyEntries);, чтобы получить массив строк, который вы ищете.

string allTheText = System.IO.File.ReadAllText(@"C:\randoms\randnum.txt"); 
string[] numbers = allTheText.Split(new char[]{}, StringSplitOptions.RemoveEmptyEntries); 
2

вы можете использовать LINQ:

var ints = code.SelectMany(s => s.Split(' ')).Select(int.Parse).ToList(); 

Это будет ваш список разделенных пробелами чисел и придавить их в одномерный Список Интс

+0

Пробовал это первым с тем же результатом, к сожалению. –

1

Некоторые из этих ответов являются большими , но если ваш файл содержит любые строки, которые не могут быть преобразованы в int, int.Parse() выдаст исключение.

Хотя немного дороже, попробуйте вместо этого использовать TryParse. Это дает вам некоторую обработку исключений:

int tmp = 0; // Used to hold the int if TryParse succeeds 

int[] intsFromFile = 
    File.ReadAllText(@"C:\randoms\randnum.txt") 
     .Split(null) 
     .Where(i => int.TryParse(i, out tmp)) 
     .Select(i => tmp) 
     .ToArray(); 
+0

OP говорит, что «я читаю текстовый файл с использованием C# .Net v3.5 express 2010 **, содержащего целые числа ** в формате« – dotctor

+0

, что, если файл содержит любой символ разделителей, например «\ t» или «\ n»? то вы теряете некоторые из чисел.«файлы не всегда находятся в точном формате, который вы ожидаете от них:« – dotctor

+0

Я имею в виду, что если «файлы не всегда находятся в точном формате, который вы ожидаете от них», вы не должны ожидать, что числа будут разделены просто символом пробела – dotctor

0

Это однострочный вкладыш, действительно. Это даст вам 1-мерный массив целых чисел в файле:

private static rxInteger rxInteger = new Regex(@"-?\d+") ; 

... 

int[] myIntegers1 = rxInteger 
        .Matches(File.ReadAllText(@"C:\foo\bar\bazbat")) 
        .Cast<Match>() 
        .Select(m => int.Parse(m.Value)) 
        .ToArray() 
        ; 

Если вы хотите быть в 2-мерную рваный массив, это не намного сложнее:

int[][] myIntegers2 = File 
         .ReadAllLines(@"C:\foo\bar\bazbat") 
         .Select(s => 
         rxInteger 
         .Matches(s) 
         .Cast<Match>() 
         .Select(m => int.Parse(m.Value)) 
         .ToArray() 
        ) 
         .ToArray() 
         ; 

[реализация проверки и обработки ошибок в качестве упражнения для читателя]

Смежные вопросы