我对c#比较新,我正在创建一个可以读取文本文件中所有行的Windows应用程序。用户将在Column [0]中输入需要替换的字符串,并在DataGridView控件的列1中输入需要替换的文本。
我创建了两个字符串数组column0和column1。 但是,我在替换行(column0,column1)
中的字符串时收到错误以下是我的代码:
string[] column0 = new string[dgvMapping.Rows.Count];
string[] column1 = new string[dgvMapping.Rows.Count];
int j = 0;
foreach(DataGridViewRow row in dgvMapping.Rows)
{
if (!string.IsNullOrEmpty(Convert.ToString(row.Cells[0].Value)))
{
column0[j] = Convert.ToString(row.Cells[0].Value);
column1[j] = Convert.ToString(row.Cells[1].Value);
j++;
}
}
var _data = string.Empty;
String[] arrayofLine = File.ReadAllLines(ofd.FileName);
using (StreamWriter sw = new StreamWriter(ofd.FileName + ".output"))
{
for (int i = 0; i < arrayofLine.Length; i++)
{
string line = arrayofLine[i];
line = line.Replace(column0[i], column1[i]);
sw.WriteLine(line);
}
}
我正在使用OpenFileDialog来选择文件。
答案 0 :(得分:0)
Stuartd是正确的......文件中的行数多于要搜索的元素数。我不确定搜索在某种程度上看起来有多么局限。代码似乎根据它的行来搜索每个项目。第0列中的搜索值和第0行的第1列中的替换值将仅替换文件中第一行的值。 DataGridView
的第二行值将仅搜索/替换SECOND行,依此类推。这看起来很奇怪。
示例两个字符串数组(column0和column1)的大小设置为dgvMapping
中的行数。假设网格中有5行,那么数组大小将为5个字符串。当您开始循环以写入字符串时,循环从0开始并停止在文件中的行数。代码使用此i
变量作为两个数组的索引。如果文件中有更多行,那么网格中有行......那么您将收到错误。
同样,这样做似乎很奇怪,并以这种方式替换。假设您要在第0列的所有行中搜索EACH术语,并将找到的搜索字符串替换为第1列中的替换字符串,则需要在文件中的EACH行中遍历网格的EACH行。这将使用文件中的所有行替换网格中的所有搜索/替换术语。如果这就是你在下面要完成的是实现这一目标的一种方法,那么......可能有更好的方法来实现这一目标。
下面的代码将文件读入一个大字符串。然后代码循环遍历所有网格行以搜索/替换大字符串中的字符串。希望这会有所帮助。
string bigString = File.ReadAllText(ofd.FileName);
try {
using (StreamWriter sw = new StreamWriter(ofd.FileName + ".output")) {
for (int k = 0; k < dgvMapping.Rows.Count; k++) {
if (dgvMapping.Rows[k].Cells[0].Value != null && dgvMapping.Rows[k].Cells[1].Value != null) {
string searchTerm = dgvMapping.Rows[k].Cells[0].Value.ToString();
string replaceTerm = dgvMapping.Rows[k].Cells[1].Value.ToString();
if (searchTerm != "") {
bigString = bigString.Replace(searchTerm, replaceTerm);
} else {
// one of the terms is empty
}
} else {
// one of the terms is null}
}
}
sw.WriteLine(bigString);
}
}
catch (Exception ex) {
MessageBox.Show("Write Erro: " + ex.Message);
}
答案 1 :(得分:0)
您正在循环包含未知行数的文件,并假设网格中的行数与文件的行数完全相同。只有当文件和gridView具有相同的行数时,您的代码才会起作用。
其中一个解决方案是循环遍历行数组(正如您已经做过的那样),并搜索GridViewRow,其中当前行包含DGV中的键。如果是这种情况,则用该行中的值(从gridView获取)替换键的所有出现,否则不执行任何操作。
查看以下代码:
// Convert the row collection to a list, so that we could query it easily with Linq
List<DataGridViewRow> mySearchList = dataGridView1.Rows.Cast<DataGridViewRow>().ToList();
const int KEY_INDEX = 0; // Search index in the grid
const int VALUE_INDEX = 1; // Value (replace) index in the grid
for (int i = 0; i < arrayofLines.Length; i++)
{
string line = arrayofLines[i];
// Get data grid view Row where this line contains the key string
DataGridViewRow matchedRow = mySearchList.FirstOrDefault(obj => line.Contains(obj.Cells[KEY_INDEX].Value.ToString()));
// If this row exists, replace the key with the value (obtained from the grid)
if (matchedRow != null)
{
string key = matchedRow.Cells[KEY_INDEX].Value.ToString();
string value = matchedRow.Cells[VALUE_INDEX].Value.ToString();
line = line.Replace(key, value);
sw.WriteLine(line);
}
else
{
// Otherwise, do nothing
}
}