去掉重复值IO操作

Java文件读写示例

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

public class IoTest {

private static final String DIR_PATH = "C:\\新建文件夹";
private static final String WRITE_FILE_PATH = "C:\\新建文件夹\\output\\test.txt";
private static int readFileCount = 0;

public static void main(String[] args) {
Set<String> userIdSet = new LinkedHashSet<String>();
List<String> filePathList = getFileNames(DIR_PATH);
for (String filePath : filePathList) {
readFile(filePath, userIdSet);
}
writeFile(WRITE_FILE_PATH, userIdSet);
}

private static void writeFile(String writeFilePath, Set<String> userIdSet) {
File dir = new File(writeFilePath.substring(0, writeFilePath
.lastIndexOf("\\")));
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(writeFilePath);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}

FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
try {
fileWriter = new FileWriter(writeFilePath, false);// 第二个参数表示:是否为追加模式
bufferedWriter = new BufferedWriter(fileWriter);
int writeFileCount = 0;
for (Object userId : userIdSet) {
bufferedWriter.write(userId.toString());
bufferedWriter.newLine();
System.out.println(++writeFileCount + " : " + userId.toString()
+ " write");
}
bufferedWriter.write("=====end=====");
bufferedWriter.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedWriter != null) {
bufferedWriter.close();
}
if (fileWriter != null) {
fileWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

private static void readFile(String readFilePath, Set<String> userIdSet) {
String userId;
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try {
fileReader = new FileReader(readFilePath);
bufferedReader = new BufferedReader(fileReader);
while ((userId = bufferedReader.readLine()) != null) {
userIdSet.add(userId);
System.out.println(++readFileCount + " : " + userId + " read");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
if (fileReader != null) {
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* 获得目录下所有文件完整路径
* @param dirPath 目录路径
* @return
*/
private static List<String> getFileNames(String dirPath) {
List<String> filePathList = new ArrayList<String>();
File rootFile = new File(dirPath);
String[] nameArray = rootFile.list();
for (int i = 0; i < nameArray.length; i++) {
File tempFile = new File(rootFile.getPath(), nameArray[i]);
if (tempFile.isFile()) {
filePathList.add(dirPath + "\\" + nameArray[i]);
}
}
return filePathList;
}
}
<think>我们被要求使用ArcEngine从Shapefile属性表中移除复记录。虽然没有直接的"Remove Duplicates"方法,但我们可以通过以下步骤实现: 1. 读取属性表,识别复记录(基于某些字段或所有字段) 2. 选择复记录(保留一条,删除其他) 3. 删除选中的复记录 注意:删除记录时要小心,确保不删除所有记录(保留每个复组中的一条)。 步骤: 1. 打开工作空间和要素类(Shapefile) 2. 使用查询过滤器读取数据 3. 使用游标遍历记录,根据指定字段的值判断复 4. 标记复记录(使用OID列表) 5. 使用ITable.DeleteS方法删除复记录(注意:删除操作不可逆,建议先备份) 另外,也可以使用ICursor和IQueryFilter结合,通过分组统计找出复项。 然而,由于Shapefile不支持数据库中的复杂操作(如GROUP BY),我们需要在内存中进行分组。 方法: 我们将遍历所有行,将指定字段的值组合作为键,记录该键出现的次数和对应的OID列表。然后,对于每个复的键,保留一个OID,将其他OID加入待删除列表。 实现代码框架: 假设我们根据一个或多个字段(比如字段名数组)来检查复。 步骤: 1. 打开工作空间和表(要素类也是一个表) 2. 创建字典(Dictionary)来存储字段组合值到OID列表的映射 3. 使用游标遍历所有行,对于每一行,获取指定字段的值组合(作为字典的键),并将当前行的OID添加到该键对应的列表中 4. 遍历字典,对于每个键,如果对应的OID列表数量大于1,则除了第一个OID外,其他OID都加入待删除列表 5. 使用ITable.DeleteS方法传入待删除的OID集合(注意:需要先构造一个包含这些OID的查询过滤器) 但是,注意:删除记录时,不能同时修改正在遍历的表,所以我们需要先收集OID,然后进行删除操作。 另一种更安全的方法是:先选择复的记录(保留一条),然后删除选中的记录。 代码示例: 由于我们使用ArcEngine,以下为C#示例: ```csharp // 假设字段名数组 string[] fieldsToCheck = new string[] { "Field1", "Field2" }; // 打开工作空间和表(这里以Shapefile路径为例) string shapefilePath = @"C:\data\myshapefile.shp"; IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactoryClass(); IWorkspace workspace = workspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(shapefilePath), 0); IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace; IFeatureClass featureClass = featureWorkspace.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(shapefilePath)); ITable table = (ITable)featureClass; // 用于存储字段组合值到OID列表的字典 Dictionary<string, List<int>> valueDict = new Dictionary<string, List<int>>(); // 使用游标遍历 ICursor cursor = table.Search(null, false); IRow row; while ((row = cursor.NextRow()) != null) { // 构建键:将每个字段的值用分隔符连接(注意:如果字段值为空,需要处理) StringBuilder keyBuilder = new StringBuilder(); foreach (string field in fieldsToCheck) { int index = table.FindField(field); if (index == -1) throw new Exception($"Field {field} not found."); object value = row.get_Value(index); keyBuilder.Append(value == null ? "null" : value.ToString()); keyBuilder.Append("|"); // 使用一个不常见的分隔符 } string key = keyBuilder.ToString(); // 将OID加入字典 if (!valueDict.ContainsKey(key)) { valueDict.Add(key, new List<int>()); } valueDict[key].Add(row.OID); } // 收集待删除的OID(除了每个键的第一个OID) List<int> oidsToDelete = new List<int>(); foreach (List
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值