Programmēšana

sadalīt komandu DOS / Windows caur Groovy

Viena no komandām, kuras man visvairāk pietrūkst no Linux, strādājot Windows / DOS vidēs, ir split komanda. Šī ārkārtīgi parocīgā komanda ļauj sadalīt lielu failu vairākos mazākos failos, ko nosaka mazāko failu vēlamo rindiņu vai baitu (vai kilobaitu vai megabaitu) skaits. Šādai funkcionalitātei ir daudz lietojumu, tostarp failu ievietošana noteiktos datu nesējos, failu padarīšana "lasāma" lietojumprogrammās ar faila garuma ierobežojumiem un tā tālāk. Diemžēl es nezinu par dalītu ekvivalentu Windows vai DOS. PowerShell var būt skripts, lai veiktu kaut ko līdzīgu šim, taču šī ieviešana ir raksturīga PowerShell. Ir pieejami arī trešo pušu produkti, kas veic līdzīgu funkcionalitāti. Tomēr šie esošie risinājumi atstāj tikai pietiekami daudz, lai būtu vēlams, lai man būtu motivācija ieviest dalītu ekvivalentu Groovy, un tas ir šī amata priekšmets. Tā kā Groovy darbojas ar JVM, šo ieviešanu teorētiski varētu palaist jebkurā operētājsistēmā ar modernu Java Virtual Machine ieviešanu.

Lai pārbaudītu un demonstrētu uz Groovy balstītu sadalīto skriptu, ir nepieciešams noteikta veida avota fails. Es izmantošu Groovy, lai viegli ģenerētu šo avota failu. Šis vienkāršais Groovy skripts buildFileToSplit.groovy izveido vienkāršu teksta failu, kuru var sadalīt.

#! / usr / bin / env groovy // // buildFileToSplit.groovy // // Pieņem vienu argumentu rindu skaitam, kas jāraksta ģenerētajā failā. // Ja rindu skaits nav norādīts, tiek izmantota noklusējuma vērtība 100 000 rindu. // if (! args) {println "\ n \ nLietojums: buildFileToSplit.groovy fileName lineCount \ n" println "kur fileName ir izveidojamā faila nosaukums un lineCount ir" println "rindu skaits, kas jāievieto ģenerētajā failu. " System.exit (-1)} fileName = args [0] numberOfLines = args.length> 1? args [1] kā vesels skaitlis: 100000 file = new File (fileName) // izdzēš izejas failu, ja tas jau pastāvēja file.delete () 1.upto (numberOfLines, {file << "Šī ir rinda # $ {it}. \ n "}) 

Šis vienkāršais skripts izmanto Groovy netieši pieejamo "args" rokturi, lai piekļūtu komandrindas argumentiem skriptam buildFileToSplit.groovy. Pēc tam tas izveido vienu lieluma failu, pamatojoties uz norādīto rindu skaita argumentu. Katra rinda lielākoties nav oriģināla un norāda "Šī ir rindiņa #", kam seko rindas numurs. Tas nav izdomāts avota fails, taču tas darbojas sadalīšanas piemērā. Nākamais ekrāna momentuzņēmums parāda tā darbību un tā izvadi.

Izveidotais source.txt fails izskatās šādi (šeit tiek parādīts tikai tā sākums un beigas):

Šī ir 1. rindiņa. Šī ir 2. līnija. Šī ir 3. līnija. Šī ir 4. līnija. Šī ir 5. līnija. Šī ir 6. līnija. Šī ir 7. rindiņa. Šī ir 8. līnija. Šī ir 9. līnija. Šī ir 10. līnija. . . . Šī ir līnija # 239. Šī ir 240. līnija. Šī ir rinda Nr. 241. Šī ir līnija Nr. 242. Šī ir 243. rinda. Šī ir 244.rinda. Šī ir 245. rinda. Šī ir 246. rindiņa. Šī ir 247. rindiņa. Šī ir 248. rindiņa. Šī ir 249. līnija. Šī ir 250. līnija. 

Tagad ir pieejams sadalīšanas avota fails. Šis skripts ir ievērojami garāks, jo esmu licis tam pārbaudīt vairāk kļūdu apstākļu, jo tam jāapstrādā vairāk komandrindas parametru un vienkārši tāpēc, ka tas ir vairāk nekā skripts, kas ģenerēja avota failu. Skripts, ko vienkārši sauc par split.groovy, tiek parādīts nākamais:

#! / usr / bin / env groovy // // split.groovy // // Sadaliet vienu failu vairākos failos līdzīgi kā darbojas Unix / Linux split // komanda. Šī skripta versija ir paredzēta tikai teksta failiem. // // Šis skripts dažos veidos atšķiras no Linux / Unix varianta. Piemēram, // skripta izvades ziņojumi vairākos gadījumos atšķiras, un šim // skriptam ir nepieciešams, lai sadalāmā faila nosaukums būtu jānorāda kā // komandrindas arguments, nevis jānodrošina iespēja to nodrošināt kā // standarta ievadi . Šis skripts nodrošina arī opciju "-v" ("--version"), kas // netiek reklamēts Linux / Unix versijai. UZMANĪBU: Šis skripts ir paredzēts tikai kā ilustrācija Groovy izmantošanai, lai // atdarinātu komandu Unix / Linux. Tas nav paredzēts ražošanai // izmantot tādu, kāds tas ir. Šis skripts ir paredzēts, lai izveidotu failu rezerves kopijas, kas izveidotas // no viena avota faila sadalīšanas, bet tiek izveidota tikai viena rezerves versija //, un to aizstāj ar jebkādiem citiem pieprasījumiem. // // //marxsoftware.blogspot.com/ // importēt java.text.NumberFormat NEW_LINE = System.getProperty ("line.separator") // // komandrindas argumentu apstrādei izmantojiet Groovy's ClientBuilder // def cli = jauns CliBuilder (lietojums: 'split [OPTION] [INPUT [PREFIX]]') cli.with {h (longOpt: 'help', 'Usage Information') a (longOpt: 'suffix-length', type: Number, ' Izmantojiet N garuma sufiksus (noklusējums ir 2), argumenti: 1) b (longOpt: 'bytes', tips: Number, 'Katra izvades faila lielums baitos', args: 1) l (longOpt: 'lines', tips: Skaits, 'Rindu skaits vienā izvades failā', argumenti: 1) t (longOpt: 'verbose', 'Print diagnostic in standard error tieši pirms katra izvades faila atvēršanas', argument: 0) v (longOpt: 'version ',' Output version and exit ', args: 0)} def opt = cli.parse (args) if (! Opt || opt.h) {cli.usage (); return} if (opt.v) {println "Versija 0.1 (2010. gada jūlijs)"; return} if (! opt.b &&! opt.l) {println "Norādiet sadalīto failu garumu ar baitu vai rindu skaitu" cli.usage () return} if (opt.a &&! opt.a. isNumber ()) {println "Sufiksa garumam jābūt skaitlim"; cli.usage (); return} if (opt.b &&! opt.b.isNumber ()) {println "Failu lielumam baitos jābūt skaitlim"; cli.usage (); return} if (opt.l &&! opt.l.isNumber ()) {println "Līniju skaitam jābūt skaitlim"; cli.usage (); return} // // Nosakiet, vai sadalītie faili tiks izmērīti pēc rindu skaita vai baitu skaita // privātā ene LINES_OR_BYTES_ENUM {BYTES, LINES} bytesOrLines = LINES_OR_BYTES_ENUM.LINES def sufikssLength = opt.a? opt.a.toBigInteger (): 2 if (sufikssLength 1? opt.arguments () [1]: "x" mēģiniet {file = new File (faila nosaukums) ja (! file.exists ()) {println "Source file $ {filename} nav derīgs avota fails. "System.exit (-4)} int fileCounter = 1 firstFileName =" $ {prefix} $ {fileSuffixFormat.format (0)} "if (verboseMode) {System.err.println "Izveido failu $ {firstFileName} ..."} outFile = createFile (firstFileName) if (bytesOrLines == LINES_OR_BYTES_ENUM.BYTES) {int byteCounter = 0 file.eachByte {if (byteCounter <numberBytes) {outFile << jauna virkne (tā )} else {nextOutputFileName = "$ {prefix} $ {fileSuffixFormat.format (fileCounter)}" if (verboseMode) {System.err.println "Faila $ {nextOutputFileName} izveide ..."} outFile = createFile (nextOutputFileName) outFile << new String (it) fileCounter ++ byteCounter = 0} byteCounter ++}} else {int lineCounter = 0 file.eachLine {if (lineCounter <numberLines) {outFile << it << NEW_LINE} else {nextOutputFileName = "$ {prefix} $ {fileSuffixFormat.format (fileCounter)} " if (verboseMode) {System.err.println "Izveido failu $ {nextOutputFileName} ..."} outFile = createFile (nextOutputFileName) outFile << tas << NEW_LINE fileCounter ++ lineCounter = 0} lineCounter ++}}} catch (FileNotFoundException) println System.properties println "$ {fileName} nav derīgs avota fails: $ {fnfEx.toString ()}" System.exit (-3)} catch (NullPointerException npe) {println "Radusies NullPointerException: $ {npe.toString ()} "System.exit (-4)} / ** * Izveidojiet failu ar norādīto faila nosaukumu. * * @param fileName Izveidojamā faila nosaukums. * @return Fails izveidots ar norādīto vārdu; null, ja norādītais nosaukums ir null vai * tukšs. * / def File createFile (String fileName) {if (! fileName) {println "Nevar izveidot failu no nulles vai tukša faila nosaukuma." return null} outFile = jauns fails (faila nosaukums), ja (outFile.exists ()) {outFile.renameTo (jauns fails (faila nosaukums + ".bak")) outFile = jauns fails (faila nosaukums)} atgriežasFile} 

Šo skriptu varētu optimizēt un labāk modulēt, taču tas izpilda savu mērķi parādīt, kā Groovy nodrošina jauku pieeju no platformas neatkarīgu lietderības skriptu ieviešanai.

Nākamais ekrāna momentuzņēmums parāda, kā skripts izmanto Groovy iebūvēto CLI atbalstu.

Nākamie divi ekrāna momentuzņēmumi parāda avota faila sadalīšanu mazākos failos pēc attiecīgi rindu numuriem un baitiem (un izmantojot dažādas sufiksu un faila nosaukuma opcijas). Pirmais attēls parāda, ka trīs izvades faili tiek ģenerēti, sadalot tos 100 rindās (250 rindas avota failā). Opcija -a norāda, ka faila nosaukumā būs četras veselā skaitļa vietas. Atšķirībā no Linux sadalījuma, šis skripts negarantē, ka lietotāja norādītais veselu skaitļu skaits ir pietiekams, lai segtu nepieciešamo izvades failu skaitu.

Otrajā attēlā (nākamais attēls) tiek parādīts skripts, kas avota failu sadala, pamatojoties uz baitu skaitu un numerācijai izmantojot citu faila nosaukumu un tikai divus veselus skaitļus.

Kā minēts iepriekš, šis skripts ir "aptuvens griezums". To varētu uzlabot gan paša koda, gan funkcionalitātes ziņā (paplašināts, lai labāk atbalstītu bināros formātus un pārliecinātos, vai faila nosaukuma sufiksi ir pietiekami ilgi, lai iegūtu izejas failu skaitu). Tomēr šeit esošais skripts patiešām parāda vienu no maniem iecienītākajiem Groovy lietojumiem: rakstīt no platformas neatkarīgus skriptus, izmantojot pazīstamas Java un Groovy bibliotēkas (SDK un GDK).

Šo stāstu “split Command for DOS / Windows Via Groovy” sākotnēji publicēja JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found