【问题标题】:Remove unwanted Text before and after a character in .csv/.txt/.xml删除 .csv/.txt/.xml 中字符前后不需要的文本
【发布时间】:2014-08-20 19:40:55
【问题描述】:

嗨,朋友们,我有一个 .csv 文件,其中有一些我想要删除的不需要的文本,仅用于提取文件名。 到目前为止,我已经尝试了下面的代码,但它从文件中删除了整个数据。 如果有人有任何解决此问题的想法,请提供帮助。使用 C# 和 powershell 脚本的灵魂将不胜感激。

(Get-Content "D:\Saved\document\document1.csv") |

Foreach-object {$_ -replace ".>" -replace "<.>"} |

Set-Content "D:\Saved\document\document1.csv"

文件的文本如下:

    <deployment>
  <metadata>
    <title>TEST-2014-08026</title>
    <date>30-05-2014</date>
    <author>Developer</author>
    <svnrevision>svn://10.285.120.144/devmd/Trunk</svnrevision> 
  </metadata>
  <csvfiles>
    <csv>
        <file>Directorcsv\tcl\safetodl\Spec_typ\TEST-2014-08026_Spec_typ.csv</file>
        <loadCtl>tcl\safetodl\Spec_typ\Spec_typ.ctl</loadCtl>
        <AffectedTables>
            <table tname="Spec_typ"/>
        </AffectedTables>
    </csv>
    <csv>
        <file>Directorcsv\tcl\safetodl\Spec_typ_arg\TEST-2014-08026_Spec_typ_arg.csv</file>
        <loadCtl>tcl\safetodl\Spec_typ_arg\Spec_typ_arg.ctl</loadCtl>
        <AffectedTables>
            <table tname="Spec_typ_arg"/>
        </AffectedTables>
    </csv>
    <csv>
        <file>Directorcsv\tcl\safetodl\doc_lolcation\TEST-2014-08026_doc_lolcation.csv</file>
        <loadCtl>tcl\safetodl\doc_lolcation\doc_lolcation.ctl</loadCtl>
        <AffectedTables>
            <table tname="doc_lolcation"/>
        </AffectedTables>
    </csv>

    <csv>
        <file>Directorcsv\tcl\safetodl\stsmst\TEST-2014-08026_stsmst.csv</file>
        <loadCtl>tcl\safetodl\stsmst\stsmst.ctl</loadCtl>
        <AffectedTables>
            <table tname="stsmst"/>
        </AffectedTables>
    </csv>

    <csv>
        <file>Directorcsv\tcl\safetodl\stsmst\TEST-2014-08026_stsmst.csv</file>
        <loadCtl>tcl\safetodl\stsmst\stsmst.ctl</loadCtl>
        <AffectedTables>
            <table tname="stsmst"/>
        </AffectedTables>
    </csv>

  </csvfiles>
  <files>
    <labels>
        <label>
          <directories>
            <dir>labels</dir>
          </directories>
          <labelFiles>
            <labFile>LABEL\5348_dev_carlbl.POF</labFile>
            <labFile>LABEL\5348_dev_carlbl.lbl</labFile>
            <labFile>5348_dev_carlbl.msql</labFile>
          </labelFiles>
        </label>
    </labels>
  </files>
</deployment>   

代码

代码 2

<deployment>
  <metadata>
    <title>Test-2014-01825</title>
    <date>05-03-2014</date>
    <svnrevision>svn://10.285.120.144/devmd/Trunk/wm/LES</svnrevision>
    <packagedir/>
  </metadata>
   <dda>
    <packages>
      <dda-package>
        <library>TCP_Add_Exports</library>
        <package-name>uc-TCP-inbound-report</package-name>
      </dda-package>
    </packages>
  </dda>
  <moca>
     <mocadir>TCPint</mocadir>
     <commands>
        <command>list_TCP_inbound_report.mcmd</command>
        <command>list_TCP_inboundheader_report.mcmd</command>
     </commands>
  </moca>
</deployment>

我想将结果另存为 For EX:

TEST-2014-08026_Spec_typ.csv
Spec_typ.ctl
TEST-2014-08026_Spec_typ_arg.csv
Spec_typ_arg.ctl
TEST-2014-08026_doc_lolcation.csv

【问题讨论】:

  • 为什么在此处标记 C#? =|
  • @Seva 因为两种语言的解决方案对我都很有用,通过这种方式,我可以让更多的成员在这里帮助我。谢谢

标签: c# .net powershell


【解决方案1】:

或者,您也可以对其进行正则表达式搜索...

GC D:\Convert\txtdoc\rtbTextBox.csv | ?{$_ -match "\\([^\\]+?\.(?:csv|ctl))<"}|%{$Matches[1]}

如果你想将它输出到一个文件,你可以通过管道将它输出到 Out-File。

输出:

TEST-2014-08026_doc_typ.csv
doc_typ.ctl
TEST-2014-08026_doc_typ_arg.csv
doc_typ_arg.ctl
TEST-2014-08026_doc_lblfmt.csv
doc_lblfmt.ctl
TEST-2014-08026_dscmst.csv
dscmst.ctl
TEST-2014-08026_lblfmt.csv
lblfmt.ctl

编辑:只抓取 CSV 和 CTL 文件。如果您希望所有这些都将(?:csv|ctl) 更改为.*?,那么您就设置好了。

Edit2:好的,必须稍微修改一下,但这现在应该会获取所有文件名:

GC C:\temp\test.txt | ?{$_ -match "(?:.*?file.*?|loadctl|command)>.*?\\?([^\\]+?\..*?)<"}|%{$Matches[1]}

输出:

TEST-2014-08026_doc_typ.csv
doc_typ.ctl
TEST-2014-08026_doc_typ_arg.csv
doc_typ_arg.ctl
TEST-2014-08026_doc_lblfmt.csv
doc_lblfmt.ctl
TEST-2014-08026_dscmst.csv
dscmst.ctl
TEST-2014-08026_lblfmt.csv
lblfmt.ctl
1662_ceva_carlbl.POF
1662_ceva_carlbl.lbl
1662_ceva_carlbl.msql

这会抓取节点名称中带有file 并匹配*.* 模式的任何内容,以及匹配*.* 模式的loadctl 节点。

【讨论】:

  • 谢谢你几乎我得到了我想要的但仍然有一些东西丢失了我没有得到最后一行.msql文件使用这个代码请帮助。 GC D:\Convert\txtdoc\rtbTextBox.csv | ?{$_ -match "\([^\]+?\.(.*?))
  • 嗨,我在运行 EDIT2 代码时遇到错误 运算符'-match'的错误参数:解析“(?:.?file.?|loadctl)>.?\?([^]+ ?..?).?\?([^]+?..?)
  • 对不起,它的格式不正确,所以它丢失了字符。我更正了格式。您需要在行首修复文件路径。
  • 首先我要感谢您解决了我的问题。但是我又遇到了麻烦,我还有一个 .TXT 文件,其中有 Text As Code2 请参阅第一篇文章
  • 我更新了代码,但您需要做的只是将节点名称添加到匹配模式的开头,其中可能的节点用竖线字符分隔。所以(?:.*?file.*?|loadctl) 变成了(?:.*?file.*?|loadctl|command),它现在也包含了那个节点。您应该能够对其进行调整以备将来使用。
【解决方案2】:

您的文本不是 csv 文件,而是 xml 文件。 Powershell 可以非常轻松地解析 xml(我已将信息从 &lt;csvfiles&gt; 提取到 &lt;/csvfiles&gt; ):

[xml]$file=Get-Content D:\Convert\txtdoc\rtbTextBox.csv
$file.csvfiles.csv | foreach { $_.file+"   ---->>  "+$_.loadCtl } 

会输出

load\hcl\safetoload\doc_typ\TEST-2014-08026_doc_typ.csv   ---->>  hcl\safetoload\doc_typ\doc_typ.ctl                  
load\hcl\safetoload\doc_typ_arg\TEST-2014-08026_doc_typ_arg.csv   ---->>  hcl\safetoload\doc_typ_arg\doc_typ_arg.ctl  
load\hcl\safetoload\doc_lblfmt\TEST-2014-08026_doc_lblfmt.csv   ---->>  hcl\safetoload\doc_lblfmt\doc_lblfmt.ctl      
load\hcl\safetoload\dscmst\TEST-2014-08026_dscmst.csv   ---->>  hcl\safetoload\dscmst\dscmst.ctl                      
load\hcl\safetoload\lblfmt\TEST-2014-08026_lblfmt.csv   ---->>  hcl\safetoload\lblfmt\lblfmt.ctl 

只提取文件名:

PS>$file.csvfiles.csv |%{ (split-path $_.file -leaf) +"   ---->>  "+ (split-path $_.loadCtl -leaf)} 

输出

    TEST-2014-08026_doc_typ.csv   ---->>  doc_typ.ctl                                                     
    TEST-2014-08026_doc_typ_arg.csv   ---->>  doc_typ_arg.ctl                                             
    TEST-2014-08026_doc_lblfmt.csv   ---->>  doc_lblfmt.ctl                                               
    TEST-2014-08026_dscmst.csv   ---->>  dscmst.ctl                                                       
    TEST-2014-08026_lblfmt.csv   ---->>  lblfmt.ctl 

【讨论】:

  • 是的,你是对的,它是一个 XML 文件,我已将此 XML 文件转换为 .CSV。我在提取确切的文件名时遇到问题。简而言之,从下面的行中,我只想将输出数据作为“TEST-2014-08026_doc_typ.csv”而不是整行 load\hcl\safetoload\doc_typ\TEST-2014-08026_doc_typ.csv
  • 附加链接 FYR。的 csv 文件请查看此内容以帮助我。谢谢。 [链接]speedyshare.com/rnzAx/download/rtbTextBox.csv
  • 您的输出结果对我来说看起来很完美,它与我想要的完全一样。但是,当我尝试运行您提供的脚本时,出现以下错误。 Split-Path:无法将参数绑定到参数“Path”,因为它为空。在 D:\xml.ps1:2 char:35 + $file.csvfiles.csv |%{ (split-path .file -leaf) +" ---->> "+ (split-path $_.loadCtl -leaf)} + CategoryInfo : InvalidData: (:) [Split-Path], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.Split PathCommand_
  • 是的,我使用的是 3.8.0.129 版本的 powershell
  • 试试这样的:$file.csvfiles.csv |%{ $path= $($_.file); (split-path -Path $path -leaf)}
【解决方案3】:

最简洁的方法是将数据解析为 XmlDocument 并通过 XPath 选择器进行处理。或者,您可以使用 XmlSerializer 将这些文件反序列化为已定义的类。

C# 解决方案(快速而肮脏的版本,添加更多!= null 检查)

XmlDocument document = new XmlDocument();

//Load the xml from a file
document.Load(fileName);

XmlNodeList csvNodes = document.SelectNodes("//csv");
if (csvNodes == null) return;

StringBuilder builder = new StringBuilder();

foreach (XmlNode csvNode in csvNodes)
{
    //You might want to add some checks for null here
    string file = csvNode.SelectSingleNode("./file").InnerText;
    string loadCtl = csvNode.SelectSingleNode("./loadCtl").InnerText;

    //Trim the paths
    file = file.Substring(file.LastIndexOf('\\') + 1);
    loadCtl = loadCtl.Substring(loadCtl.LastIndexOf('\\') + 1);

    builder.AppendLine(file);
    builder.AppendLine(loadCtl);
}

string result = builder.ToString();

输出:

TEST-2014-08026_doc_typ.csv

doc_typ.ctl

TEST-2014-08026_doc_typ_arg.csv

doc_typ_arg.ctl

TEST-2014-08026_doc_lblfmt.csv

doc_lblfmt.ctl

TEST-2014-08026_dscmst.csv

dscmst.ctl

TEST-2014-08026_lblfmt.csv

lblfmt.ctl

【讨论】:

  • 嗨,当我尝试运行您的上述代码时,我的意思是在执行结果 = 空白屏幕后我想在 .csv 文件中获得结果,是否可以通过单击按钮?
  • 这不是一个完整的程序,只是一个sn-p。您的结果将存储在“结果”变量中。如果要将其写入文件,只需添加行 System.IO.File.WriteAllText(csvFilename,result);
猜你喜欢
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多