2016-11-02 9 views
0

このWebサイトでは、この機能のコーディングについては何も見つかりませんでした。findstr csvファイルを使用して各行に新しい列を作成

ここには私が持っている情報の一部と、それをどうしたいのかが書かれています。 日付が

Type, ID, HouseNu,TimeDepart,StartingAdress,EndingAdress, etc.. 
Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Nov 2 2016 12:00AM 
Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Nov 3 2016 12:00AM 

(私の例のように)一日のデータの後に常にある私はそれがこのよう

Date,Type, ID, HouseNu,TimeDepart,StartingAdress,EndingAdress, etc.. 
Nov 2 2016,Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Nov 2 2016,Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Nov 2 2016,Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Nov 2 2016,Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Nov 3 2016,Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Nov 3 2016,Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Nov 3 2016,Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 
Nov 3 2016,Occ, 12345, 122 str xxx, 13:30, 77 Street xyz, 150 Street xyz 

が可能ということですしたいですか?私は、 "12:00 AM"はdatetime以外のデータには表示されないことを知っています。だから、findstrを使ってデータの下に日付を見つけてこの日付の列を追加し、日付が変わると日付も変わるでしょうか?

十分明確であるかどうかわかりません!そうでない場合はコメントしてください。 この問題について私があなたに教える時を感謝します。

FYIの出力はMS SQLデータベースからのもので、ストアドプロシージャを使用してsqlcmdを使用してすべてのデータをエクスポートしました。引数は日付で、私はstorecプロシージャの "do while"を実行して4日間のデータを取得します。エクスポートはバッチスクリプトを使って削除した無駄な情報を私に与えます。しかし、findstrを使ってカラムを追加する方法はわかりません。

ここで私は、これらすべての情報を取得するために使用しているコード:

del /q Results.csv 
sqlcmd -S serveur -i C:\TA_UPS_Script\SqlScript.sql -o C:\TA_UPS_Script\Results.csv -s; -SServeur\XYZ -E 
findstr /v "Changed database context to 'XYZ'." C:\TA_UPS_Script\Results.csv > C:\TA_UPS_Script\ETAPE1.csv 
findstr /v "Warning" C:\TA_UPS_Script\ETAPE1.csv > C:\TA_UPS_Script\ETAPE2.csv 
findstr /v "Matricule" C:\TA_UPS_Script\ETAPE2.csv > C:\TA_UPS_Script\ETAPE3.csv 
findstr /v /c:"--------" C:\TA_UPS_Script\ETAPE3.csv > C:\TA_UPS_Script\ETAPE4.csv 
del /q C:\TA_UPS_Script\ETAPE1.csv 
del /q C:\TA_UPS_Script\ETAPE2.csv 
del /q C:\TA_UPS_Script\ETAPE3.csv 
del /q C:\TA_UPS_Script\Results.csv 
type C:\TA_UPS_Script\ETAPE4.csv | repl "1899-12-30 " "" L > C:\TA_UPS_Script\ETAPE5.csv 
type C:\TA_UPS_Script\ETAPE5.csv | repl ":00.000" "" L > C:\TA_UPS_Script\ETAPE6.csv 
type C:\TA_UPS_Script\ETAPE6.csv | repl ".000" "" L > C:\TA_UPS_Script\ETAPE7.csv 
del /q C:\TA_UPS_Script\ETAPE4.csv 
del /q C:\TA_UPS_Script\ETAPE5.csv 
del /q C:\TA_UPS_Script\ETAPE6.csv 
type C:\TA_UPS_Script\Header.csv C:\TA_UPS_Script\ETAPE7.csv > C:\TA_UPS_Script\Results.csv 
del /q C:\TA_UPS_Script\ETAPE7.csv 
+2

これはコード作成サービスではありません。これまでに何を試しましたか?あなたのコードを投稿してください!あなたがそれを走らせたとき何が起こったのですか?代わりに何が起こると思いますか?具体的に何が問題になっていますか? – Robert

+0

こんにちは@ロバート、私は決して完全なプログラミングコードを取得するように頼むことはありません。 SQLデータベースからsqlcmdを使用してすべてのデータをエクスポートします。ここで私が使用したコードが、私はfindstrを使用して新しい列を作成するときに固執しています。私はそれを行う方法を探しています。 – Xtrem3

+0

カンマの後ろのスペースはCSVファイルに本当に存在しますか? – aschipfl

答えて

1

、あなたのタスクを解決するために任意の自身の努力を示さなかったが、それはしませんので、私は、そのためのスクリプトを提供することを決定しました私にとっては非常に些細なことです。だからここに説明のコメントをフィーチャーし、コードです:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_FILE_IN=sample.csv" & rem // (input file) 
set "_FILE_OUT=con"  & rem /* (output file; must not be equal to input file! 
          rem  state `con` to output to console) */ 
set "_FIELD=Date" & rem // (name of prepended field to be inserted into header) 
set "_SEPAR=," & rem // (separator character; should be the `,`) 
set "$HEADER=#" & rem /* (defines whether a header is present in the input file; 
        rem  set to empty value in case no header is there) */ 

rem // Redirect all data to output file once to avoid multiple file accesses: 
> "%_FILE_OUT%" (
    rem // Reset index counter: 
    set /A "IDX=0" 
    rem // Read input file line by line: 
    for /F usebackq^ delims^=^ eol^= %%L in ("%_FILE_IN%") do (
     rem // Check whether header is available: 
     if defined $HEADER (
      rem // Current line is the header, so prepend new field name: 
      echo(%_FIELD%%_SEPAR%%%L 
      rem // Reset header flag to not treat any more lines as header: 
      set "$HEADER=" 
     ) else (
      rem // Current line is not the header, so capture it: 
      set "LINE=%%L" 
      rem // Check whether current line is one of the non-CSV lines: 
      setlocal EnableDelayedExpansion 
      rem Avoid trouble with pipe by temporarily doubling all ": 
      set "LINE=!LINE:"=""!^" 
      rem Avoid trouble with pipe by temporarily escaping all %: 
      set "LINE=!LINE:%%=^%%!" 
      (echo "!LINE!" | > nul find "%_SEPAR%") && (
       endlocal 
       rem // Current line is standard CSV line, so increment index: 
       set /A "IDX+=1" 
       rem /* Store current line in array-like variable `ARRAY[]`; 
       rem use `for /F` loop to overcome `endlocal` barrier: */ 
       setlocal EnableDelayedExpansion 
       for /F "delims=" %%E in ("ARRAY[!IDX!]=!LINE!") do (
        endlocal 
        set "%%E" 
       ) 
      ) || (
       endlocal 
       rem // Current line is non-CSV line, so extract date: 
       for /F "tokens=1-3" %%I in ("%%L") do (
        rem // The first three tokens constitute the date: 
        set "LINE=%%I %%J %%K" 
       ) 
       rem // Return all stored CSV lines, preceded by found date: 
       setlocal EnableDelayedExpansion 
       for /L %%K in (1,1,!IDX!) do (
        echo(!LINE!%_SEPAR%!ARRAY[%%K]! 
       ) 
       endlocal 
       rem // Reset index counter: 
       set /A "IDX=0" 
      ) 
     ) 
    ) 
    rem /* Return remaining stored CSV lines, preceded by an empty field, 
    rem for them not to be lost in case of a badly formatted file: */ 
    setlocal EnableDelayedExpansion 
    for /L %%K in (1,1,!IDX!) do (
     echo(%_SEPAR%!ARRAY[%%K]! 
    ) 
    endlocal 
) 

endlocal 
exit /B 

非CSVラインに遭遇するまで基本的には、このバッチファイルは、配列のような変数ARRAY[]内のすべての行をバッファリング(そのようなものが何も,を含まない)、すべてその上に非CSV回線の日付部分の前にキャッシュされた回線が出力されます。

この手法は、ファイルに表示されるすべての種類の特殊文字に対して堅牢であると考えられています。

+0

このスクリプトをありがとう。私は完全なスクリプトを要求することは決してありませんし、あなたはそれを行う方法を見つけるためにしばらく検索し、それを行うための適切な方法を見つけたことはないと言います。私はちょうどそれを行うための最善の方法を尋ねる。しかし、私はファイルと出力の名前を設定し、 ";"セパレータとして。スクリプトはファイルを作成しますが、Forループにロックされているようです。何かアドバイス? – Xtrem3

+0

これまでのところあなたの作品は何も見せていないのですが、これは通常ここで期待されています。とにかく、このスクリプトはあなたの質問のサンプルデータを使って私のために働きます。 '、'を ';'に置き換えても、テストデータを見ていなくても分かりにくいです。入力ファイルを確認するには、1)Windowsスタイルの改行(CR + LF)と2)ANSIファイル(Unicodeでないかどうか)を確認します。それをメモ帳で開き、どのように見えるかを確認してから(「改行がありませんか?」)、「ファイル»名前を付けて保存...」ダイアログを開き、「エンコーディング:」フィールドをチェックします。 – aschipfl

関連する問題