Je dispose d'un fichier texte nommé C:/test.txt
:lecture dans des fichiers qui contiennent des caractères spécifiques en C#
1 2 3 4 5 6
Je veux lire chaque numéro dans ce fichier en utilisant StreamReader
.
Comment puis-je faire cela?
Je dispose d'un fichier texte nommé C:/test.txt
:lecture dans des fichiers qui contiennent des caractères spécifiques en C#
1 2 3 4 5 6
Je veux lire chaque numéro dans ce fichier en utilisant StreamReader
.
Comment puis-je faire cela?
Avez-vous vraiment besoin d'utiliser un StreamReader
pour ce faire?
IEnumerable<int> numbers =
Regex.Split(File.ReadAllText(@"c:\test.txt"), @"\D+").Select(int.Parse);
(Il est évident que si elle est impossible de lire le fichier entier en un seul coup, vous aurez besoin de le diffuser, mais si vous êtes en mesure d'utiliser File.ReadAllText
alors c'est la façon de le faire, à mon avis.)
Pour être complet, voici une version en streaming:
public IEnumerable<int> GetNumbers(string fileName)
{
using (StreamReader sr = File.OpenText(fileName))
{
string line;
while ((line = sr.ReadLine()) != null)
{
foreach (string item in Regex.Split(line, @"\D+"))
{
yield return int.Parse(item);
}
}
}
}
Je peux me tromper mais avec StreamReader vous ne pouvez pas définir de délimiteur. Mais vous pouvez utiliser String.Split() pour définir delimeter (c'est de l'espace dans votre cas?) Et extraire tous les nombres dans un tableau séparé.
Quelque chose comme ceci:
using System;
using System.IO;
class Test
{
public static void Main()
{
string path = @"C:\Test.txt";
try
{
if(File.Exists(path))
{
using(StreamReader sr = new StreamReader(path))
{
while(sr.Peek() >= 0)
{
char c = (char)sr.Read();
if(Char.IsNumber(c))
Console.Write(c);
}
}
}
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
}
}
Euh ... Peut-être qu'il me manque quelque chose ici (il fait froid et mon cerveau n'aime pas le froid). Pourquoi supprimez-vous le fichier d'entrée, puis essayez de l'ouvrir? – ZombieSheep
ahah you'r droite xD j'écrivais vite et intellisense fait la blague :) – Salv0
Quelque chose comme cela devrait fonctionner:
using (var sr = new StreamReader("C:/test.txt"))
{
var s = sr.ReadToEnd();
var numbers = (from x in s.Split('\n')
from y in x.Split(' ')
select int.Parse(y));
}
using (StreamReader reader = new StreamReader(stream))
{
string contents = reader.ReadToEnd();
Regex r = new Regex("[0-9]");
Match m = r.Match(contents);
while (m.Success)
{
int number = Convert.ToInt32(match.Value);
// do something with the number
m = m.NextMatch();
}
}
Quelque chose comme si pourrait faire l'affaire, si ce que vous voulez est de lire des entiers d'un fichier et stockez-les dans une liste.
try
{
StreamReader sr = new StreamReader("C:/test.txt"))
List<int> theIntegers = new List<int>();
while (sr.Peek() >= 0)
theIntegers.Add(sr.Read());
sr.Close();
}
catch (Exception e)
{
//Do something clever to deal with the exception here
}
Solution pour les grands fichiers:
class Program
{
const int ReadBufferSize = 4096;
static void Main(string[] args)
{
var result = new List<int>();
using (var reader = new StreamReader(@"c:\test.txt"))
{
var readBuffer = new char[ReadBufferSize];
var buffer = new StringBuilder();
while ((reader.Read(readBuffer, 0, readBuffer.Length)) > 0)
{
foreach (char c in readBuffer)
{
if (!char.IsDigit(c))
{
// we found non digit character
int newInt;
if (int.TryParse(buffer.ToString(), out newInt))
{
result.Add(newInt);
}
buffer.Remove(0, buffer.Length);
}
else
{
buffer.Append(c);
}
}
}
// check buffer
if (buffer.Length > 0)
{
int newInt;
if (int.TryParse(buffer.ToString(), out newInt))
{
result.Add(newInt);
}
}
}
result.ForEach(Console.WriteLine);
Console.ReadKey();
}
}
est-ce que le fichier * contiennent seulement * numéros, ou pourrait-il y avoir d'autres personnages? –
Votre question ne semble pas liée à votre exemple. Les nombres ne sont pas des caractères spéciaux ... – James