C#从文件或标准输入设备读取指定行的方法
程序员文章站
2022-06-14 17:19:17
本文实例讲述了c#从文件或标准输入设备读取指定行的方法。分享给大家供大家参考。具体如下:
using system;
using system.io;
usi...
本文实例讲述了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( "*.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#程序设计有所帮助。