说我有一个文本文件OrderedDict([('Sample Code', 'Vendor Sample ID'),
('Donor ID', 'Vendor Subject ID'),
('Format', 'Material Format'),
('Sample Type', 'Sample Type'),
('Age', 'Age'),
('Gender', 'Gender'),
('Ethnicity/ Race', 'Race'),
('Organ', 'Organ'),
('Pathological Diagnosis', 'Diagnosis'),
('Detailed Pathological Diagnosis', 'Detailed Diagnosis'),
('Clinical Diagnosis/Cause of Death',
'Detailed Diagnosis option 2'),
('Dissection', 'Dissection'),
('Quantity (g, ml, or ug)', 'Quantity'),
('HIV', 'HIV'),
('HEP B', 'HEP B')])
OrderedDict([('Sample Code', 'Vendor Sample ID'),
('Donor ID', 'Vendor Subject ID'),
('Sample Type', 'Sample Type'),
('Ethnicity/ Race', 'Race'),
('Organ', 'Organ'),
('Pathological Diagnosis', 'Diagnosis'),
('Detailed Pathological Diagnosis', 'Detailed Diagnosis'),
('Clinical Diagnosis/Cause of Death',
'Detailed Diagnosis option 2'),
('Dissection', 'Dissection'),
('Quantity (g, ml, or ug)', 'Quantity'),
('HIV', 'HIV'),
('HEP B', 'HEP B'),
('tata', ['Gender', 'Age', 'Material Format'])])
123.txt
我的目标是使用one,two,three
four,five,six
将每行的第一个字符大写。这是我的尝试:
Get-Culture
结果:
$str = gc C:\Users\Administrator\Desktop\123.txt
#Split each line into an array
$array = $str.split("`n")
for($i=0; $i -lt $array.Count; $i++) {
#Returns O and F:
$text = (Get-Culture).TextInfo.ToTitleCase($array[$i].Substring(0,1))
#Supposed to replace the first letter of each array with $text
$array[$i].Replace($array[$i].Substring(0,1), $text) >> .\Desktop\finish.txt
}
我知道One,twO,three
Four,Five,six
替换了当前数组的每一个匹配项,这就是为什么我确保它只用.Replace()
替换数组的第一个字符,但是这并不是#39;工作。
答案 0 :(得分:2)
尝试以下方法:
Get-Content C:\Users\Administrator\Desktop\123.txt | ForEach-Object {
if ($_) {
$_.Substring(0, 1).ToUpper() + $_.Substring(1)
} else {
$_
}
} > .\Desktop\finish.txt
Get-Content
逐行读取输入文件,并通过管道发送每一行 - 剥去其行终止符。
ForEach-Object
处理关联脚本块中的每一行,其中$_
表示手头的行:
if ($_)
测试该行是否为非空,即是否至少有1个字符;如果没有,else
块只是通过空行。$_.Substring(0, 1).ToUpper()
将行的第一个字符转换为大写,隐式使用当前文化(使用单个字符,这相当于应用Get-Culture).TextInfo.ToTitleCase()
)。+ $_.Substring(1)
附加其余部分。只需要>
rater而不是>>
来写入输出文件,因为整个管道的输出都是一次写入的。
答案 1 :(得分:2)
这不起作用的原因是因为你要替换角色......
$array[$i].Substring(0,1)
...但是你在整个数组元素上使用了Replace方法
$array[$i].Replace(...
这里数组元素是一个字符串,等于输入的一行。所以它将取代该角色的每一次出现。
Get-Content
(除非您使用-Raw
参数)默认情况下将文本作为字符串数组返回。所以你应该可以使用这个正则表达式替换(我使用ToString().ToUpper()
- Get-Culture
方法没有错误)
$str = gc C:\Users\Administrator\Desktop\123.txt
foreach($line in $str){
$line -replace '^\w', $line[0].ToString().ToUpper() >> .\Desktop\finish.txt
}
正则表达式解释:
^
是一个锚点。它指定"字符串的开头"
\w
匹配单词字符 - 通常是a-z,A-Z,0-9
有关更具针对性的^\p{Ll}
和here的详细信息,请参阅mklement0的评论here