2017-05-27 249 views
0

我需要幫助優化批處理文件以將多個xml文件的多個xml文件轉換爲.txt或.csv文件。批處理文件提取許多.xml文件的xml標記的值

.xml的格式都是相同的。他們的臨牀研究,並期待這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<clinical_study rank="373"> 
    <!-- This xml conforms to an XML Schema at: 
    https://clinicaltrials.gov/ct2/html/images/info/public.xsd --> 
    <required_header> 
    <download_date>ClinicalTrials.gov processed this data on May 25, 2017</download_date> 
    <link_text>Link to the current ClinicalTrials.gov record.</link_text> 
    <url>https://clinicaltrials.gov/show/NCT00146471</url> 
    </required_header> 
    <id_info> 
    <org_study_id>Kep-F10.3.01</org_study_id> 
    <nct_id>NCT00146471</nct_id> 
    </id_info> 
    <brief_title>Efficacy and Safety of Levetiracetam in the Inpatient Treatment of Alcohol Withdrawal Syndrome</brief_title> 
    <official_title>Efficacy and Safety of Levetiracetam in the Inpatient Treatment of Alcohol Withdrawal Syndrome [Sicherheit Und Wirksamkeit Von Levetiracetam (Keppra) für Die Behandlung Des stationären Alkoholentzugsyndroms]</official_title> 
    <sponsors> 
    <lead_sponsor> 
     <agency>Charite University, Berlin, Germany</agency> 
     <agency_class>Other</agency_class> 
    </lead_sponsor> 
    </sponsors> 
    <source>Charite University, Berlin, Germany</source> 
    <oversight_info> 
    <has_dmc>Yes</has_dmc> 
    </oversight_info> 
    <brief_summary> 
    <textblock> 
     The purpose of this study is to evaluate the efficacy and safety of levetiracetam for 
     treating alcohol withdrawal syndrome (AWS) in inpatients (vs. placebo). The primary come-out 
     parameter is the reduction of the total needed amount of diazepam for add-on treatment of 
     acute alcohol withdrawal symptoms. The secondary come-out parameter are - safety criteria 
     (AE) - reduction of alcohol withdrawal score over the days. 
    </textblock> 
    </brief_summary> 
    <overall_status>Completed</overall_status> 
    <start_date>January 2006</start_date> 
    <completion_date type="Actual">September 2007</completion_date> 
    <primary_completion_date type="Actual">July 2007</primary_completion_date> 
    <phase>Phase 3</phase> 
    <study_type>Interventional</study_type> 
    <has_expanded_access>No</has_expanded_access> 
    <study_design_info> 
    <allocation>Randomized</allocation> 
    <intervention_model>Parallel Assignment</intervention_model> 
    <primary_purpose>Treatment</primary_purpose> 
    <masking>Double Blind (Participant, Care Provider, Investigator)</masking> 
    </study_design_info> 
    <primary_outcome> 
    <measure>To evaluate the efficacy and safety of levetiracetam for treating alcohol withdrawal syndrome in inpatients. The primary come-out parameter is the reduction of the amount of diazepam for add-on treatment of acute alcohol withdrawal</measure> 
    <time_frame>during trial</time_frame> 
    </primary_outcome> 
    <secondary_outcome> 
    <measure>Secondary come-out parameters are - safety criteria (AE) - reduction of alcohol withdrawal score over the days</measure> 
    <time_frame>during trial</time_frame> 
    </secondary_outcome> 
    <number_of_arms>2</number_of_arms> 
    <enrollment type="Actual">120</enrollment> 
    <condition>Alcohol Withdrawal Syndrome</condition> 
    <arm_group> 
    <arm_group_label>2</arm_group_label> 
    <arm_group_type>Active Comparator</arm_group_type> 
    </arm_group> 
    <arm_group> 
    <arm_group_label>1: Diazepam plus Placebo</arm_group_label> 
    <arm_group_type>Placebo Comparator</arm_group_type> 
    </arm_group> 
    <intervention> 
    <intervention_type>Drug</intervention_type> 
    <intervention_name>Levetiracetam</intervention_name> 
    <description>1500-2000 mg daily add-on or Placebo Diazepam as needed</description> 
    <arm_group_label>2</arm_group_label> 
    <other_name>KEPPRA</other_name> 
    </intervention> 
    <intervention> 
    <intervention_type>Drug</intervention_type> 
    <intervention_name>Placebo</intervention_name> 
    <description>1500-2000 mg daily add-on or Placebo Diazepam as needed</description> 
    <arm_group_label>1: Diazepam plus Placebo</arm_group_label> 
    </intervention> 
    <eligibility> 
    <criteria> 
     <textblock> 
     Inclusion Criteria: 

      - Ages eligible for study: 18-65 years. 

      - Meets criteria for alcohol dependence according to DSM-IV/ICD-10 

      - Known withdrawal symptoms in the past in case of discontinuation of alcohol 
      consumption 

      - Hospital admission for alcohol detoxification 

      - Able to provide a written informed consent. 

      - Able to follow verbal and written instructions (incl. a sufficient knowledge of 
      German language). 

      - Must be medically acceptable for study treatment. No past or present physical 
      disorder that is likely to deteriorate during participation. No ECG abnormality which 
      would likely worsen during participation and no clinical laboratory abnormality that 
      would also suggest deterioration during treatment. 

      - Have a negative urine drug screen for benzodiazepines or heroine or methadone 

     Exclusion Criteria: 

      - Current diagnosis of any other substance dependence syndrome other than alcohol 
      dependence (excluding nicotine and caffeine dependence). 

      - History of idiopathic epilepsy. 

      - Patient with any current clinically significant psychiatric disorder (acute 
      suiciality) or developmental disorder (including organic mental disorder), like 
      psychotic disorders. 

      - Patients with the following complications of alcoholism (lifetime): acute delirium 
      tremens, hallucinatory alcoholic state, Korsakoff`s syndrome, Wernicke 
      encephalopathy, decomposed liver cirrhosis (Child B, C), suspected cirrhosis with the 
      following clinical symptoms detected at clinical exam: signs of portal hypertension 
      and signs of hepato-cellular failure, thrombocytopenia. 

      - Subjects with known sensitivity of previous adverse reaction to levetiracetam 

      - Contra-indication (hypersensitivity to levetiracetam or pyrrolidone derivatives) or 
      known non-response to levetiracetam. 

      - History of severe GI disease which might render absorption of the medication 
      difficult or produce medical instability of the patient which would include active 
      peptic ulcer disease, ulcerative colitis, regional colitis, or evidence by history or 
      physical exam of GI bleeding. 

      - Patients with any clinically significant acute or chronic progressive neurological, 
      gastrointestinal, cardiovascular, hepatic, renal, haematological, endocrine, 
      dermatological or respiratory disease, such as diabetes, severe infection, acute 
      alcoholic hepatitis, or any other medical condition with significant worsening of the 
      clinical situation of the patient that might interfere with the evaluation of study 
      medication. 

      - Female patients pregnant, breast-feeding or of child bearing age and not protected by 
      effective contraceptive such as implants, injectables, combined oral contraceptives, 
      some IUDS, sexual abstinence, sterilization or vasectomized partner. 

      - Actually continuous use of pharmacological agents that are known to lower the seizure 
      threshold or augment or decrease the alcohol withdrawal syndrome. 

      - Subjects with known sensitivity of previous adverse reaction to diazepam or clonidine 

      - Contra-indication or known non-response to diazepam or clonidine 
     </textblock> 
    </criteria> 
    <gender>All</gender> 
    <minimum_age>18 Years</minimum_age> 
    <maximum_age>65 Years</maximum_age> 
    <healthy_volunteers>No</healthy_volunteers> 
    </eligibility> 
    <overall_official> 
    <last_name>Martin Schaefer, MD</last_name> 
    <role>Principal Investigator</role> 
    <affiliation>Charité Campus Mitte, Klinik für Psychiatrie und Psychotherapie</affiliation> 
    </overall_official> 
    <location> 
    <facility> 
     <name>MLU Halle-Wittenberg</name> 
     <address> 
     <city>Halle</city> 
     <state>Sachen/Anhalt</state> 
     <zip>06097</zip> 
     <country>Germany</country> 
     </address> 
    </facility> 
    </location> 
    <location> 
    <facility> 
     <name>Charité - Universitätsmedizin Berlin, Campus Charité Mitte, Klinik für Psychiatrie und Psychotherapie</name> 
     <address> 
     <city>Berlin</city> 
     <zip>10117</zip> 
     <country>Germany</country> 
     </address> 
    </facility> 
    </location> 
    <location> 
    <facility> 
     <name>Psychiatrische Klinik der Charité im St.-Hedwig Krankenhaus</name> 
     <address> 
     <city>Berlin</city> 
     <zip>10559</zip> 
     <country>Germany</country> 
     </address> 
    </facility> 
    </location> 
    <location> 
    <facility> 
     <name>Klinik für Psychiatrie und Suchtmedizin, Kliniken Essen Mitte</name> 
     <address> 
     <city>Essen</city> 
     <zip>45136</zip> 
     <country>Germany</country> 
     </address> 
    </facility> 
    </location> 
    <location> 
    <facility> 
     <name>Zentrum für Seelische Gesundheit</name> 
     <address> 
     <city>Rhede</city> 
     <zip>46414</zip> 
     <country>Germany</country> 
     </address> 
    </facility> 
    </location> 
    <location_countries> 
    <country>Germany</country> 
    </location_countries> 
    <reference> 
    <citation>Krebs M, Leopold K, Richter C, Kienast T, Hinzpeter A, Heinz A, Schaefer M. Levetiracetam for the treatment of alcohol withdrawal syndrome: an open-label pilot trial. J Clin Psychopharmacol. 2006 Jun;26(3):347-9.</citation> 
    <PMID>16702910</PMID> 
    </reference> 
    <verification_date>September 2008</verification_date> 
    <lastchanged_date>December 29, 2009</lastchanged_date> 
    <firstreceived_date>September 6, 2005</firstreceived_date> 
    <responsible_party> 
    <name_title>Martin Schaefer, MD</name_title> 
    <organization>Charite University, Berlin, Germany</organization> 
    </responsible_party> 
    <keyword>alcohol withdrawal</keyword> 
    <keyword>detoxification</keyword> 
    <keyword>Inpatients</keyword> 
    <keyword>alcohol dependence according to DSM-IV/ICD-10</keyword> 
    <keyword>withdrawal symptoms</keyword> 
    <condition_browse> 
    <!-- CAUTION: The following MeSH terms are assigned with an imperfect algorithm --> 
    <mesh_term>Syndrome</mesh_term> 
    <mesh_term>Substance Withdrawal Syndrome</mesh_term> 
    </condition_browse> 
    <intervention_browse> 
    <!-- CAUTION: The following MeSH terms are assigned with an imperfect algorithm --> 
    <mesh_term>Ethanol</mesh_term> 
    <mesh_term>Diazepam</mesh_term> 
    <mesh_term>Etiracetam</mesh_term> 
    <mesh_term>Piracetam</mesh_term> 
    </intervention_browse> 
    <!-- Results have not yet been posted for this study        --> 
</clinical_study> 

所以他們都使用相同的標記,我需要一些他們喜歡:

  • overall_official
  • lead_sponsor
  • official_title
  • results_reference
  • overall_status

到目前爲止,我試着用下面的代碼:

@echo off 
setlocal enabledelayedexpansion 
for %%a in (*.xml) do (
call :XMLExtract "%%a" "<results_reference>" location 
echo.!location!,%%~na 
) 
exit /b 

:XMLExtract file keystart location 
@echo off & setlocal 
for /f "tokens=3 delims=<>" %%a in ('Findstr /i /c:%2 "%~1"') do (
    set "loc=%%a" & goto :endloop 
) 
:endLoop 
ENDLOCAL & IF "%~3" NEQ "" (SET %~3=%loc%) ELSE echo.%loc% 
exit /b 

我跑在命令行批:蝙蝠>> output.txt中或output.csv它完美地工作了overall_status,但所有其它標籤有問題,例如:

  • overall_offical:它停止後像他們一樣的10
  • 其他標籤:文件名中列出(一如既往),但它背後的信息。

我真的很感謝任何關於如何解決這個問題的方法或者其他有效解決這個問題的方法。我對編程只有一點基本的瞭解,但我一定能夠將自己融入到任何簡單的解決方案中。最好的幫助將是一種優化批處理代碼以適應此問題的方法。如果缺少一些信息,我很抱歉,我會提供。

+0

我不認爲一個人可以設置'%3',因爲它是參數重定向重定向的commands輸出。 – SteveFest

+0

我建議使用本機支持XML格式的語言來操作XML數據,因爲純批處理腳本可能很容易違反規範並使數據無法訪問...... – aschipfl

回答

0
@ECHO Off 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
:: SET "tags=overall_official lead_sponsor official_title results_reference overall_status" 
SET "tags=%*" 

FOR /f "tokens=1delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*.xml" ' 
) DO (
REM Clear detected-tags flags for each file "%%a" 
FOR %%t IN (%tags% malformed) DO SET "%%t=" 
REM remove "rem" from following line to delete any existing result file 
REM del "%destdir%\%%~na.txt" >nul 2>nul 
REM Read each line to %%L - usebackq to allow "quoted filenames" 
FOR /f "usebackqdelims=" %%L IN ("%sourcedir%\%%a") DO (
    REM remove leading spaces from %%L into %%P 
    FOR /f "tokens=*" %%P IN ("%%L") DO (
    REM tokenise on "<>" 
    FOR /f "tokens=1-3*delims=<>" %%w IN ("%%P") DO (
    IF "%%z" neq "" SET "malformed=%%z" 
    FOR %%t IN (%tags%) DO IF "%%w"=="%%t" (SET "%%t=Y") else IF "%%w"=="/%%t" (SET "%%t=") 
    SET "report=" 
    FOR %%t IN (%tags%) DO IF DEFINED %%t SET "report=Y" 
    REM (1 of 2) un-rem this to deposit in individual filenames 
    REM (
    IF DEFINED report (
    REM we may have 1,2 or 3 tokens 
    REM if 3, output token 2 
    REM if 2, output token 1 if token 2 starts "/", token 2 otherwise 
    REM if only 1, output entire line unless it is a target token 
    IF "%%y" equ "" (
     IF "%%x" equ "" (
     REM only one token 
     FOR %%t IN (%tags%) DO IF "%%w"=="%%t" (SET "report=") else IF "%%w"=="/%%t" (SET "report=") 
     IF DEFINED report ECHO %%L 
    ) ELSE (
     REM two tokens 
     ECHO %%x|FINDSTR /b "/">NUL 2>NUL 
     IF ERRORLEVEL 1 (ECHO %%x) ELSE (ECHO %%w) 
    ) 
    ) ELSE (ECHO %%x) 
    ) 
    REM (2 of 2) un-rem this to deposit in individual filenames 
    REM)>>"%destdir%\%%~na.txt" 
    FOR %%t IN (%tags%) DO IF "%%y"=="/%%t" (SET "%%t=") 
    FOR %%t IN (%tags%) DO IF "%%x"=="/%%t" (SET "%%t=") 
    ) 
    REM pause 
) 
) 
) 

GOTO :EOF 

你需要改變的sourcedirdestdir設置以適合你的情況。

這可能會給你一些想法。您還沒有在適當的echo小號

預計語法提供的輸出樣本,所以也許你會想前綴源文件名的每個輸出線(%%~na)運行:

thisbatchname標籤標記tag

我的方法是有%%a包含要被處理的文件名,%%L從文件的原始數據線和與%%P LEA的原始數據線丁空間被剝奪。

使用分隔符產生%%W%%z的Tokenising %%P因爲每行包含1-3個可能的元素 - 標籤或數據。如果有第四個,那麼就會出現問題(標記爲malformed的文件被設置,儘管我沒有對它做任何事情 - 它將包含問題所在的文本[也可以設置爲%%P行...])

因此,使用所需要的標籤作爲變量名,只需設置那些varnames到什麼東西和使用if defined來解釋他們的狀態 - 這是對他們的運行時狀態工作數據逐行改變。

請注意,由於代碼的整個運行部分是一個龐大的代碼塊,因此必須使用rem而不是::以提供有用的註釋。

還要注意的是

(
commands 
)>file 

將根據指定的(如果需要)

+0

非常感謝Magoo,這對我有很大的幫助!代碼的工作方式與您的方式完全相同。儘管我還有一個額外的問題。我怎樣才能讓輸出結果顯示如下標籤:_tag_ - >信息或(甚至更好):一個csv文件,它不會將每個單詞放在自己的列中,而是將整個標籤放入一列? 所以,最後我想要一個文件,其中包括所有信息的概述。 –

+0

如果你想要標籤,只需'echo %% P'或'echo %% L'而不是'echo'%'w%%y' – Magoo

+0

好極了!謝謝:D –