私がやりたいのは、テキストファイル内の文字列のすべてのインスタンスを見つけて、その文字列を含む完全な行を配列に追加することです。
例えば:
eng GB English
lir LR Liberian Creole English
mao NZ Maori
たとえば、engを検索するには、最初の2行を配列に追加する必要があります。もちろん、ファイル内の「eng」のインスタンスはさらに多く含まれます。
テキストファイル入力とC#を使用して、これをどのように行うことができますか?
textReaderを使用して各行を読み取り、検索できます。必要なものが見つかったら、その行を文字列配列に追加します。
List<string> found = new List<string>();
string line;
using(StreamReader file = new StreamReader("c:\\test.txt"))
{
while((line = file.ReadLine()) != null)
{
if(line.Contains("eng"))
{
found.Add(line);
}
}
}
または、yield return
を使用して列挙可能なものを返すことができます
1行:
using System.IO;
using System.Linq;
var result = File.ReadAllLines(@"c:\temp").Select(s => s.Contains("eng"));
または、よりメモリ効率の高いソリューションが必要な場合は、拡張メソッドをロールすることができます。 FileInfo
、FileStream
などをベースハンドラーとして使用できます。
public static IEnumerable<string> ReadAndFilter(this FileInfo info, Predicate<string> condition)
{
string line;
using (var reader = new StreamReader(info.FullName))
{
while ((line = reader.ReadLine()) != null)
{
if (condition(line))
{
yield return line;
}
}
}
}
使用法:
var result = new FileInfo(path).ReadAndFilter(s => s.Contains("eng"));
File
オブジェクトには、静的な ReadLines
メソッドが含まれています。これは ReadAllLines
とは対照的に、行ごとに返されます。配列を返すため、ファイル全体をメモリにロードする必要があります。
したがって、File.ReadLines
とLINQを使用することにより、効率的で短いソリューションは次のように記述できます。
var found = File.ReadLines().Where(line => line.Contains("eng")).ToArray();
元の質問については、各行の先頭に必要な用語が表示されているように見えるため、line.Contains
をline.StartsWith
に置き換えることでさらに最適化できます。
あなたは次のコードを試すことができます、私はそれを試しました、そしてそれは働いていました
string searchKeyword = "eng";
string fileName = "Some file name here";
string[] textLines = File.ReadAllLines(fileName);
List<string> results = new List<string>();
foreach (string line in textLines)
{
if (line.Contains(searchKeyword))
{
results.Add(line);
}
}