c# - C# 中的 FileReader 类

标签 c# .net filereader

我正在寻找快速类(class)来处理文本文件并舒适地阅读不同的对象(NextInt32、NextDouble、NextLine 等方法)。你能给我一些建议吗?

编辑: BinaryReader 在我的案例中是个糟糕的类。我的数据格式不是二进制的。我有这样的文件

1 2 3
FirstToken NextToken
1.23 2,34

我想用如下代码读取这个文件:

int a = FileReader.NextInt32();
int b = FileReader.NextInt32();
int c = FileReader.NextInt32();
int d = FileReader.NextString();
int e = FileReader.NextString();
int f = FileReader.NextDouble();
int g = FileReader.NextDouble();

Edit2:我正在寻找来自 Java 的模拟扫描器

最佳答案

我相信 TextReader 的这个扩展方法可以解决问题:

public static class TextReaderTokenizer
{
    // Adjust as needed. -1 is EOF.
    private static int[] whitespace = { -1, ' ', '\r' , '\n', '\t' };

    public static T ReadToken<T>(this TextReader reader)
    {
        StringBuilder sb = new StringBuilder();
        while (Array.IndexOf(whitespace, reader.Peek()) < 0)
        {
            sb.Append((char)reader.Read());
        }
        return (T)Convert.ChangeType(sb.ToString(), typeof(T));
    }    
}

可以这样使用:

TextReader reader = File.OpenText("foo.txt");
int n = reader.ReadToken<int>();
string s = reader.ReadToken<string>();

[EDIT] 根据问题评论中的要求,这是上面的实例包装器版本,它使用分隔符和 CultureInfo 进行参数化:

public class TextTokenizer
{
    private TextReader reader;
    private Predicate<char> isDelim;
    private CultureInfo cultureInfo;

    public TextTokenizer(TextReader reader, Predicate<char> isDelim, CultureInfo cultureInfo)
    {
        this.reader = reader;
        this.isDelim = isDelim;
        this.cultureInfo = cultureInfo;
    }

    public TextTokenizer(TextReader reader, char[] delims, CultureInfo cultureInfo)
    {
        this.reader = reader;
        this.isDelim = c => Array.IndexOf(delims, c) >= 0;
        this.cultureInfo = cultureInfo;
    }

    public TextReader BaseReader
    {
        get { return reader; }
    }

    public T ReadToken<T>()
    {
        StringBuilder sb = new StringBuilder();
        while (true)
        {
            int c = reader.Peek();
            if (c < 0 || isDelim((char)c))
            {
                break;
            }
            sb.Append((char)reader.Read());
        }
        return (T)Convert.ChangeType(sb.ToString(), typeof(T));
    }    
}

示例用法:

TextReader reader = File.OpenText("foo.txt");
TextTokenizer tokenizer = new TextTokenizer(
    reader,
    new[] { ' ', '\r', '\n', '\t' },
    CultureInfo.InvariantCulture);
int n = tokenizer.ReadToken<int>();
string s = tokenizer.ReadToken<string>();

关于c# - C# 中的 FileReader 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1562021/

相关文章:

c# - Https 调用未连接到服务器

java - 尝试将 sdCard 上的文件读取到变量

java - java中的文件读取

c# - 在 WndProc 中未获取 Windows 8 WM_POINTER* 事件

c# - 存储过程未在表中插入值

c# 在发送键之间暂停

.net - 手动创建的记录集的行为与断开连接的记录集不同

java - java中按字符读取文件

c# - ETW 格式字符串中的转义字符?

c# - DI 容器是否需要自己实例化对象才能使用构造函数注入(inject)?