C#从文件或标准输入设备读取指定行的方法

本文实例讲述了C#从文件或标准输入设备读取指定行的方法。分享给大家供大家参考。具体如下:

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Collections.Generic;
namespace RobvanderWoude
{
 class ReadLine
 {
  static int Main( string[] args )
  {
   #region Command Line Parsing
   string filename = string.Empty;
   int linestart = 1;
   int lineend = 2;
   bool concat = false;
   bool addspaces = false;
   string concatchar = string.Empty;
   bool skipempty = false;
   bool trimlines = false;
   bool numlines = false;
   bool redirected;
   bool set_c = false;
   bool set_l = false;
   bool set_s = false;
   bool set_t = false;
   bool set_input = false;
   if ( ConsoleEx.InputRedirected )
   {
    set_input = true;
    redirected = true;
   }
   else
   {
    if ( args.Length == 0 )
    {
     return WriteError( );
    }
    redirected = false;
   }
   foreach ( string arg in args )
   {
    if ( arg[0] == '/' )
    {
     try
     {
      switch ( arg.ToUpper( )[1] )
      {
       case '?':
        return WriteError( );
       case 'C':
        if ( arg.ToUpper( ) != "/C" && arg.ToUpper( ) != "/CS" )
        {
         return WriteError( "Invalid command line switch " + arg );
        }
        concat = true;
        if ( arg.ToUpper( ) == "/CS" )
        {
         addspaces = true;
        }
        if ( set_c )
        {
         return WriteError( "Duplicate command line argument /C*" );
        }
        set_c = true;
        break;
       case 'L':
        if(arg.ToUpper( ).StartsWith( "/L:" ) && arg.Length > 3)
        {
         if ( arg[2] == ':' )
         {
          string linessel = arg.Substring( 3 );
          string pattern = @"^(\-?\d+)$";
          Match match = Regex.Match( linessel, pattern );
          if ( match.Success )
          {
           linestart = Convert.ToInt32( match.Groups[1].Value );
           lineend = linestart + 1;
          }
          else
          {
           pattern = @"^(\-?\d+)\.\.(\-?\d+)$";
           match = Regex.Match( linessel, pattern );
           if ( match.Success )
           {
            linestart = Convert.ToInt32( match.Groups[1].Value );
            lineend = Convert.ToInt32( match.Groups[2].Value ) + 1;
           }
           else
           {
            pattern = @"^(\-?\d+),(\-?\d+)$";
            match = Regex.Match( linessel, pattern );
            if ( match.Success )
            {
             // numlines is true if the second number
             //specifies the number of lines instead of a line number
             numlines = true;
             linestart = Convert.ToInt32( match.Groups[1].Value );
             lineend = Convert.ToInt32( match.Groups[2].Value );
             if ( lineend < 1 )
             {
              return WriteError( "Invalid number of lines (" + lineend.ToString( ) + "), must be 1 or higher" );
             }
            }
           }
          }
         }
         else
         {
          return WriteError( "Invalid command line switch " + arg );
         }
        }
        else
        {
         return WriteError( "Invalid command line switch " + arg );
        }
        if ( set_l )
        {
         return WriteError( "Duplicate command line argument /L" );
        }
        set_l = true;
        break;
       case 'S':
        if ( arg.ToUpper( ) != "/SE" )
        {
         return WriteError( "Invalid command line switch " + arg );
        }
        skipempty = true;
        if ( set_s )
        {
         return WriteError( "Duplicate command line argument /SE" );
        }
        set_s = true;
        break;
       case 'T':
        if ( arg.ToUpper( ) != "/T" )
        {
         return WriteError( "Invalid command line switch " + arg );
        }
        trimlines = true;
        if ( set_t )
        {
         return WriteError( "Duplicate command line argument /T" );
        }
        set_t = true;
        break;
       default:
        return WriteError( "Invalid command line switch " + arg );
      }
     }
     catch
     {
      return WriteError( "Invalid command line switch " + arg );
     }
    }
    else
    {
     if ( set_input )
     {
      return WriteError( "Multiple inputs specified (file + redirection or multiple files)" );
     }
     if ( redirected )
     {
      return WriteError( "Do not specify a file name when using redirected input" );
     }
     else
     {
      filename = arg;
     }
    }
   }
   #endregion
   try
   {
    int count = 0;
    bool output = false;
    string[] lines;
    List<string> alllines = new List<string>( );
    if ( redirected )
    {
     // Read standard input and store the lines in a list
     int peek = 0;
     do
     {
      alllines.Add( Console.In.ReadLine( ) );
     } while ( peek != -1 );
     // Convert the list to an array
     lines = alllines.ToArray( );
    }
    else
    {
     // Read the file and store the lines in a list
     lines = File.ReadAllLines( filename );
    }
    // Check if negative numbers were used, and if so,
    //calculate the resulting line numbers
    if ( linestart < 0 )
    {
     linestart += lines.Length + 1;
    }
    if ( lineend < 0 )
    {
     lineend += lines.Length + 1;
    }
    if ( numlines )
    {
     lineend += linestart;
    }
    // Iterate through the array of lines and display
    //the ones matching the command line switches
    foreach ( string line in lines )
    {
     string myline = line;
     if ( trimlines )
     {
      myline = myline.Trim( );
     }
     bool skip = skipempty && ( myline.Trim( ) == string.Empty );
     if ( !skip )
     {
      count += 1;
      if ( count >= linestart && count < lineend )
      {
       if ( concat )
       {
        Console.Write( "{0}{1}", concatchar, myline );
       }
       else
       {
        Console.WriteLine( myline );
       }
       if ( addspaces )
       {
        concatchar = " ";
       }
      }
     }
    }
   }
   catch ( Exception e )
   {
    return WriteError( e.Message );
   }
   return 0;
  }
  #region Redirection Detection
  public static class ConsoleEx
  {
   public static bool OutputRedirected
   {
    get
    {
     return FileType.Char != GetFileType( GetStdHandle( StdHandle.Stdout ) );
    }
   }
   public static bool InputRedirected
   {
    get
    {
     return FileType.Char != GetFileType( GetStdHandle( StdHandle.Stdin ) );
    }
   }
   public static bool ErrorRedirected
   {
    get
    {
     return FileType.Char != GetFileType( GetStdHandle( StdHandle.Stderr ) );
    }
   }
   // P/Invoke:
   private enum FileType { Unknown, Disk, Char, Pipe };
   private enum StdHandle { Stdin = -10, Stdout = -11, Stderr = -12 };
   [DllImport( "kernel32.dll" )]
   private static extern FileType GetFileType( IntPtr hdl );
   [DllImport( "kernel32.dll" )]
   private static extern IntPtr GetStdHandle( StdHandle std );
  }
  #endregion
  #region Error Handling
  public static int WriteError( Exception e = null )
  {
   return WriteError( e == null ? null : e.Message );
  }
  public static int WriteError( string errorMessage )
  {
   if ( string.IsNullOrEmpty( errorMessage ) == false )
   {
    Console.Error.WriteLine( );
    Console.ForegroundColor = ConsoleColor.Red;
    Console.Error.Write( "ERROR: " );
    Console.ForegroundColor = ConsoleColor.White;
    Console.Error.WriteLine( errorMessage );
    Console.ResetColor( );
   }
   Console.Error.WriteLine( );
   Console.Error.WriteLine( "ReadLine, Version 0.30 beta" );
   Console.Error.WriteLine( "Return the specified line(s) from a file or Standard Input" );
   Console.Error.WriteLine( );
   Console.Error.Write( "Usage: " );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.WriteLine( "READLINE filename [ options ]" );
   Console.ResetColor( );
   Console.Error.Write( " or: " );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.WriteLine( "READLINE [ options ] < filename" );
   Console.ResetColor( );
   Console.Error.Write( " or: " );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.WriteLine( "command | READLINE [ options ]" );
   Console.ResetColor( );
   Console.Error.WriteLine( );
   Console.Error.Write( "Where: " );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.Write( "filename" );
   Console.ResetColor( );
   Console.Error.WriteLine( " is the optional file to be read" );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.Write( "   command" );
   Console.ResetColor( );
   Console.Error.WriteLine( " is the optional command whose output is to be read" );
   Console.Error.WriteLine( );
   Console.Error.Write( "Options: " );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.Write( "/C   C" );
   Console.ResetColor( );
   Console.Error.WriteLine( "oncatenate lines" );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.Write( " /CS  C" );
   Console.ResetColor( );
   Console.Error.Write( "oncatenate lines with " );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.Write( "S" );
   Console.ResetColor( );
   Console.Error.WriteLine( "paces in between" );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.Write( " /L:n" );
   Console.ResetColor( );
   Console.Error.Write( " read line " );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.WriteLine( "n" );
   Console.ResetColor( );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.Write( " /L:n..m" );
   Console.ResetColor( );
   Console.Error.Write( " read lines " );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.Write( "n" );
   Console.ResetColor( );
   Console.Error.Write( " through " );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.WriteLine( "m" );
   Console.Error.Write( "   /L:n,m" );
   Console.ResetColor( );
   Console.Error.Write( "  read " );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.Write( "m" );
   Console.ResetColor( );
   Console.Error.Write( " lines starting at line " );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.WriteLine( "n" );
   Console.ResetColor( );
   Console.Error.WriteLine( "(negative numbers start counting from the end backwards)" );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.Write( "   /SE  S" );
   Console.ResetColor( );
   Console.Error.Write( "kip " );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.Write( "E" );
   Console.ResetColor( );
   Console.Error.WriteLine( "mpty lines" );
   Console.ForegroundColor = ConsoleColor.White;
   Console.Error.Write( "   /T   T" );
   Console.ResetColor( );
   Console.Error.WriteLine( "rim leading and trailing whitespace from lines" );
   Console.Error.WriteLine( );
   Console.Error.WriteLine( "Examples:" );
   Console.Error.WriteLine( "READLINE file read the first non-empty line (default)" );
   Console.Error.WriteLine( "READLINE file /L:2 /SE read the second non-empty line of file" );
   Console.Error.WriteLine( "READLINE file /L:5..7 read lines 5..7 of file" );
   Console.Error.WriteLine( "READLINE file /L:-1 read the last line of file" );
   Console.Error.WriteLine( "READLINE file /L:-2..-1 read the last 2 lines of file" );
   Console.Error.WriteLine( "READLINE file /L:-2,2 read the last 2 lines of file" );
   Console.Error.WriteLine( );
   Console.Error.Write( "Check for redirection by Hans Passant on " );
   Console.ForegroundColor = ConsoleColor.DarkGray;
   Console.Error.WriteLine( "StackOverflow.com" );
   Console.Error.WriteLine( "/questions/3453220/how-to-detect-if-console-in-stdin-has-been-redirected" );
   Console.ResetColor( );
   Console.Error.WriteLine( );
   Console.Error.WriteLine( "Written by Rob van der Woude" );
   return 1;
  }
  #endregion
 }
}

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • C#使用文件流读取文件的方法

    本文实例讲述了C#使用文件流读取文件的方法.分享给大家供大家参考.具体如下: using System; using System.IO; namespace Client.Chapter_11___File_and_Streams { public class OpenExistingFile { static void Main(string[] args) { FileInfo MyFile = new FileInfo(@"c:\Projects\Testing.txt");

  • C#通过指针读取文件的方法

    本文实例讲述了C#通过指针读取文件的方法.分享给大家供大家参考.具体如下: // readfile.cs // 编译时使用:/unsafe // 参数:readfile.txt // 使用该程序读并显示文本文件. using System; using System.Runtime.InteropServices; using System.Text; class FileReader { const uint GENERIC_READ = 0x80000000; const uint OPEN

  • C#逐行读取文件的方法

    本文实例讲述了C#逐行读取文件的方法.分享给大家供大家参考.具体如下: 这里使用C#逐行读取文件,对于大文件的读取非常有用. StreamReader sr = new StreamReader("fileName.txt"); string line; while((line= sr.ReadLine()) != null) { Console.WriteLine("xml template:"+line); } if (sr != null)sr.Close()

  • C#读取配置文件的方法汇总

    配置文件 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="SQLConfiguration" type="ConfigurationDemo.SQLConfiguration,ConfigurationDemo"/> <section name=&

  • C#读取中文文件出现乱码的解决方法

    本文实例讲述了C#读取中文文件出现乱码的解决方法.分享给大家供大家参考.具体分析如下: 先来看这段代码: FileStream aFile = new FileStream(SingleFile,FileMode.Open); StreamReader sr = new StreamReader(aFile,Encoding.GetEncoding("gb2312"),true); string FileContent = sr.ReadToEnd(); aFile.Close();

  • C#读取二进制文件方法分析

    本文较为详细的分析了C#读取二进制文件方法.分享给大家供大家参考.具体分析如下: 当想到所有文件都转换为 XML时,确实是一件好事.但是,这并非事实.仍旧还有大量的文件格式不是XML,甚至也不是ASCII.二进制文件仍然在网络中传播,储存在磁盘上,在应用程序之间传递.相比之下,在处理这些问题方面,它们比文本文件显得更有效率些. 在 C 和 C++ 中,读取二进制文件还是很容易的.除了一些开始符(carriage return)和结束符(line feed)的问题,每一个读到C/C++中的文件都是

  • C#逐行读取txt文件的方法

    本文实例讲述了c#逐行读取txt文件的方法,是C#程序设计中非常实用的技巧,分享给大家供大家参考. 具体方法如下: private void importTxtNoAdd() { string line; string sFileName = ""; if (openFileDialog1.ShowDialog() == DialogResult.OK) { sFileName = openFileDialog1.FileName; dtTemp.Rows.Clear(); iXH =

  • C#读取目录下所有指定类型文件的方法

    本文实例讲述了C#读取目录下所有指定类型文件的方法.分享给大家供大家参考.具体分析如下: 首先要引入命名空间:using System.IO; 再写读取方法: DirectoryInfo dir = new DirectoryInfo(path); //path为某个目录,如: "D:\Program Files" FileInfo[] inf = dir.GetFiles(); foreach (FileInfo finf in inf) { if( finf.Extension.E

  • C#从文件或标准输入设备读取指定行的方法

    本文实例讲述了C#从文件或标准输入设备读取指定行的方法.分享给大家供大家参考.具体如下: using System; using System.IO; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Collections.Generic; namespace RobvanderWoude { class ReadLine { static int Main( str

  • Python3实现从文件中读取指定行的方法

    本文实例讲述了Python3实现从文件中读取指定行的方法.分享给大家供大家参考.具体实现方法如下: # Python的标准库linecache模块非常适合这个任务 import linecache the_line = linecache.getline('d:/FreakOut.cpp', 222) print (the_line) # linecache读取并缓存文件中所有的文本, # 若文件很大,而只读一行,则效率低下. # 可显示使用循环, 注意enumerate从0开始计数,而line

  • Java实现日志文件监听并读取相关数据的方法实践

    目录 项目需求 Apache Commons-IO 核心知识 代码实现 总结 项目需求 由于所在数据中台项目组需要实现监听文件夹或者日志文件并读取对应格式的脏数据的需求,以便在文件.文件夹发生变化时进行相应的业务流程:所以在这里记录下相关业务的实现及技术选型. Apache Commons-IO 首先需要添加对应依赖: <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</

  • JS实现从表格中动态删除指定行的方法

    本文实例讲述了JS实现从表格中动态删除指定行的方法.分享给大家供大家参考.具体如下: JS的表格对象有一个deleteRow方法用于删除表格中的指定行,只需要指定行号即可 <!DOCTYPE html> <html> <head> <script> function deleteRow(r) { var i=r.parentNode.parentNode.rowIndex; document.getElementById('myTable').deleteR

  • 简单文件操作python 修改文件指定行的方法

    例一: 复制代码 代码如下: #!/usr/bin/pythonimport sysimport reif __name__=="__main__": f=file("hi.txt","w+") li=["hello\n","hi\n"] f.writelines(li) f.close() "W+"模式:如果没有hi.txt则创建文件写入:如果存在,则清空hi.txt内容,从新写入.

  • C#定位txt指定行的方法小例子

    复制代码 代码如下: [DllImport("User32.dll", EntryPoint = "FindWindow")]            private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);            [DllImport("user32.dll")]            static extern IntPtr

  • python读取文件指定行内容实例讲解

    python读取文件指定行内容 import linecache text=linecache.getline(r'C:\Users\Administrator\Desktop\SourceCodeofMongoRedis\chapter_5\generate_string.py',10) 第十行内容为# info = '''1000001 王小小''' 实例扩展: 本文实例讲述了Python3实现从文件中读取指定行的方法.分享给大家供大家参考.具体实现方法如下: ''' 遇到问题没人解答?小编

  • python 实现在txt指定行追加文本的方法

    如下所示: fp = file('data.txt') lines = [] for line in fp: lines.append(line) fp.close() lines.insert(1, 'a new line') # 在第二行插入 s = '\n'.join(lines) fp = file('data.txt', 'w') fp.write(s) fp.close() 以上这篇python 实现在txt指定行追加文本的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也

  • C++操作文件进行读取、删除、修改指定行

    代码如下: /******************************************************** Copyright (C), 2016-2018, FileName: main Author: woniu201 Created: 2018/08/31 Description: 文件操作:读取指定行,删除指定行,修改指定行 ********************************************************/ #include <iost

  • python3读取文件指定行的三种方法

    行遍历实现 在python中如果要将一个文件完全加载到内存中,通过file.readlines()即可,但是在文件占用较高时,我们是无法完整的将文件加载到内存中的,这时候就需要用到python的file.readline()进行迭代式的逐行读取: filename = 'hello.txt' with open(filename, 'r') as file: line = file.readline() counts = 1 while line: if counts >= 50000000:

随机推荐