csv - مجانا - خطوط عربية تعمل مع اوفيس 2013




نسخ خطوط من ملف كسف. إلى ملف.csv آخر باستخدام البرنامج النصي الدفعة (2)

أنا إنشاء ملفات .csv من جهاز (الإخراج) وتحتاج إلى نسخ عدد محدد من الأسطر من هذا الملف إلى ملف كسف آخر الذي يحتوي على نفس الشكل.

هم لحسن الحظ نفس الشكل وهكذا كل ملف لديه نفس خطوط لنسخ أكثر (خط 68 إلى 107). كان لي الذهاب في هذا باستخدام التعليمات البرمجية من مصادر أخرى ولكن كل ما كنت قادرا على القيام به حتى الآن هو نسخ البيانات ولكن أنا غير قادر على إدراجه في الملف الآخر. أي مساعدة ستكون كبيرة!

@echo off

Set "InputFile=C:\*****\Desktop\Dev\Test\Default.csv"
Set "OutPutFile=C:\*****\Desktop\Dev\Test\OutputData.csv"
Set FromLine=68
Set ToLine=107

Call:ExtractLinesFromTextFile "%InputFile%" %FromLine% %ToLine% > 
"%OutPutFile%"

Exit /b

:ExtractLinesFromTextFile <InputFile> <FromLine> <ToLine>
(
echo Wscript.echo(ExtractLinesFromTextFile("%~1",%2,%3^)^)
echo Function ExtractLinesFromTextFile(TextFile,FromLine,ToLine^)
echo If FromLine ^<= ToLine Then
echo With CreateObject("Scripting.FileSystemObject"^).OpenTextFile(TextFile^)
echo Do Until .Line = FromLine Or .AtEndOfStream
echo .SkipLine
echo Loop
echo Do Until .Line ^> ToLine Or .AtEndOfStream
echo ExtractLinesFromTextFile = ExtractLinesFromTextFile ^& (.ReadLine ^& 
vbNewLine^)
echo Loop
echo End With
echo End If
echo End Function
)>"%~n0.vbs"
Cscript /Nologo "%~n0.vbs" "%~1" %~2 %~3
If Exist "%~n0.vbs" Del "%~n0.vbs"
Exit /b

ليس هناك حاجة مطلقا لاستخدام ملف دفعي يقوم بإنشاء واستدعاء فسكريبت.

هل يمكن إنجاز المهمة عن طريق النصي دفعة نقية مثل هذا:

@echo off
setlocal EnableExtensions EnableDelayedExpansion

rem // Define constants here:
set "_FILEIN=!USERPROFILE!\Desktop\Dev\Test\Default.csv"
set "_FILEOUT=!USERPROFILE!\Desktop\Dev\Test\OutputData.csv"
set /A "_LINEFROM=68"
set /A "_LINETO=107"

rem // Count number of lines of input file:
for /F %%C in ('^< "!_FILEIN!" find /C /V ""') do (
    rem // Read and write files using redirection:
    < "!_FILEIN!" > "!_FILEOUT!" (
        rem // Iterate through all available lines:
        for /L %%I in (1,1,%%C) do (
            rem // Read a single line:
            set "LINE=" & set /P LINE=""
            rem // Check position (line number) of current line:
            if %%I GEQ %_LINEFROM% if %%I LEQ %_LINETO% (
                rem // Return current line conditionally:
                echo(!LINE!
            )
        )
    )
)

endlocal
exit /B

لاحظ أن حلول ملف دفعة دفعة نقية قد تكون محدودة في أطوال الخط وأحجام الملفات. النهج السابق لا يمكن التعامل مع خطوط أطول من 1023 بايت والملفات مع أكثر من 2147483647 خطوط.

هنا هو الحل النصي دفعة دفعة أخرى ولكن أبطأ:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_FILEIN=%USERPROFILE%\Desktop\Dev\Test\Default.csv"
set "_FILEOUT=%USERPROFILE%\Desktop\Dev\Test\OutputData.csv"
set /A "_LINEFROM=68"
set /A "_LINETO=107"

rem // Write file using redirection:
> "%_FILEOUT%" (
    rem // Read file using a loop, prefixed with line index:
    for /F "delims=" %%L in ('findstr /N "^" "%_FILEIN%"') do (
        rem // Extract line number:
        2> nul set /A "IDX=%%L"
        rem // Read current line:
        set "LINE=%%L"
        setlocal EnableDelayedExpansion
        rem // Check position (line number) of current line:
        if !IDX! GEQ %_LINEFROM% if !IDX! LEQ %_LINETO% (
            rem // Return current line conditionally:
            echo(!LINE:*:=!
        )
        endlocal
    )
)

endlocal
exit /B

هذا النهج لا يمكن التعامل مع خطوط أطول من 8191 - 7 = 8184 بايت والملفات مع أكثر من 2147483647 خطوط.


لتوضيح سبب عدم رغبتك في القيام بذلك دفعة واحدة، هذا هو رمز نسخ السطور من 68 إلى 107 إلى ملف آخر في فسكريبت:

inputFilename  = "C:\path\to\input.csv"
outputFilename = "C:\path\to\output.csv"
fromLine = 68
toLine   = 107

Set fso = CreateObject("Scripting.FileSystemObject")
Set inFile  = fso.OpenTextFile(inputFilename)
Set outFile = fso.OpenTextFile(outputFilename, 2, True)

Do Until inFile.AtEndOfStream Or inFile.Line > toLine
  line = inFile.ReadLine
  If inFile.Line >= fromLine Then outFile.WriteLine line
Loop

inFile.Close
outFile.Close

لتوضيح سبب عدم رغبتك في القيام بذلك في فسكريبت إما، هذا هو نفس العملية في بويرشيل:

$inputFile  = 'C:\path\to\input.csv'
$outputFile = 'C:\path\to\output.csv'
$fromLine   = 68
$toLine     = 107

$skip       = $fromLine - 1
$numLines   = $toLine - $skip

Get-Content $inputFile | Select-Object -Skip $skip -First $numLines |
    Set-Content $outputFile

التي يمكن تبسيطها:

$inputFile  = 'C:\path\to\input.csv'
$outputFile = 'C:\path\to\output.csv'
$skip       = 67
$numLines   = 40

Get-Content $inputFile | Select-Object -Skip $skip -First $numLines |
    Set-Content $outputFile

يمكنك حتى الحفاظ على رأس كسف إذا كنت تريد:

$inputFile  = 'C:\path\to\input.csv'
$outputFile = 'C:\path\to\output.csv'
$skip       = 66
$numLines   = 40

Import-Csv $inputFile | Select-Object -Skip $skip -First $numLines |
    Export-Csv $outputFile -NoType




vbscript